From 7b75b781add6054ba7a8d11d3085813b862421c6 Mon Sep 17 00:00:00 2001 From: Steve Harris Date: Tue, 1 May 2012 18:31:09 -0500 Subject: [PATCH] Merge branch 'core_exp' into ss_sync (Graphics Improvements for NPP/Collaboration) used git cherry-pick -m 1 879a2e0 Initial reconciliation of Graphics Improvements for NPP/Collaboration with 12.3.1 baseline Conflicts: cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/DerivedLevelNode.java* cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/AbstractGLMesh.java cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/GLCanvasCache.java cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/GLFactoryAdapter.java cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/GLGeometryPainter.java cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/IGLTarget.java cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLImage.java cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLCMTextureData.java cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLColormappedImage.java cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImage.java cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLTarget.java cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLWireframeShape2D.java cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/objects/GLVertexBufferObject.java cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GribDataCubeAdapter.java cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/drawables/GeneralPointImageExtension.java cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/drawables/IPointImageExtension.java cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/PlotResource2.java* cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/ext/IRadarMosaicImageExtension.java edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/msgs/GetServerTimeRequest.java Conflicts: ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarRadialResource.java ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/RadarImageResource.java Former-commit-id: 05d9729acfe9e0f4af4a6ec030052ab26b0a5eb9 --- .../coopprecip/CoopPrecipDataCubeAdapter.java | 6 - .../core/maps/rsc/AbstractDbMapResource.java | 1 + .../uf/viz/core/maps/rsc/DbMapResource.java | 2 +- .../core/AbstractGraphicsFactoryAdapter.java | 7 - .../raytheon/uf/viz/core/DrawableImage.java | 7 +- .../raytheon/uf/viz/core/IGraphicsTarget.java | 41 +- .../src/com/raytheon/uf/viz/core/IMesh.java | 39 +- .../uf/viz/core/data/prep/Colormapper.java | 2 - .../core/datastructure/DataCubeContainer.java | 156 +--- .../datastructure/DefaultDataCubeAdapter.java | 239 ++++++ .../core/datastructure/IDataCubeAdapter.java | 10 - .../core/drawables/AbstractDescriptor.java | 181 ++++- .../uf/viz/core/drawables/ColorMapLoader.java | 2 +- .../core/drawables/ColorMapParameters.java | 20 +- .../uf/viz/core/drawables/IImage.java | 14 + .../uf/viz/core/drawables/ImagingSupport.java | 143 ++++ .../viz/core/drawables/SingleColorImage.java | 66 -- .../core/drawables/ext/GraphicsExtension.java | 32 +- .../ext/GraphicsExtensionManager.java | 18 +- .../drawables/ext/IImagingExtension.java} | 36 +- .../ext/IOffscreenRenderingExtension.java | 4 +- .../ext/ISingleColorImageExtension.java} | 51 +- .../viz/core/drawables/ext/TextureLoader.java | 129 ++++ .../ext/colormap/ColormappedImage.java | 240 ++++++ .../ColormappedRenderedImageCallback.java | 81 -- .../GeneralColormappedImageExtension.java | 38 +- .../IColormapShadedShapeExtension.java | 4 +- .../colormap/IColormappedImageExtension.java | 7 +- .../uf/viz/core/map/IMapMeshExtension.java | 31 +- .../uf/viz/core/map/MapDescriptor.java | 163 +--- .../rsc/AbstractPluginDataObjectResource.java | 340 +++++++++ .../rsc/AbstractRequestableResourceData.java | 23 +- .../uf/viz/core/rsc/AbstractVizResource.java | 14 +- .../rsc/capabilities/ColorMapCapability.java | 5 +- .../uf/viz/core/rsc/hdf5/ImageTile.java | 108 ++- .../viz/core/rsc/hdf5/MeshCalculatorJob.java | 163 ---- .../META-INF/MANIFEST.MF | 15 +- .../data/AbstractDataCubeAdapter.java | 394 ++++++++++ .../viz/derivparam/inv/AbstractInventory.java | 2 +- .../tree/AbstractAliasLevelNode.java | 7 +- .../tree/AbstractCubeLevelNode.java | 8 +- .../tree/AbstractDerivedLevelNode.java | 3 +- .../tree/AbstractRequestableLevelNode.java | 22 +- .../tree/CompositeAverageLevelNode.java | 8 +- .../viz/derivparam/tree/DerivedLevelNode.java | 10 +- .../derivparam/tree/ModelRunLevelNode.java | 4 +- .../uf/viz/derivparam/tree/OrLevelNode.java | 10 +- .../derivparam/tree/StaticDataLevelNode.java | 6 +- .../derivparam/tree/TimeRangeLevelNode.java | 10 +- .../viz/derivparam/tree/UnionLevelNode.java | 8 +- .../uf/viz/npp/viirs/rsc/VIIRSResource.java | 38 +- .../localization/glsl/mosaicMinDist.glsl | 16 - .../localization/glsl/mostRecentVal.glsl | 10 - cave/com.raytheon.uf.viz.radar.gl/plugin.xml | 13 +- .../viz/radar/gl/GLRadialMeshExtension.java | 4 +- .../uf/viz/radar/gl/MosaicGLTarget.java | 559 -------------- .../uf/viz/radar/gl/RadarRadialMesh.java | 201 ++++- .../uf/viz/radar/gl/RadarRadialMeshCache.java | 252 ------ .../uf/viz/radar/gl/mosaic/GLMosaicImage.java | 107 +++ .../mosaic/GLRadarMosaicImageExtension.java | 164 ++++ .../xy/varheight/rsc/VarHeightResource.java | 4 +- .../uf/viz/xy/graph/XyGraphDescriptor.java | 58 +- .../xy/hodo/HodographBackgroundResource.java | 12 +- .../uf/viz/xy/hodo/HodographDescriptor.java | 41 +- .../viz/core/contours/ContourSupport.java | 5 +- .../META-INF/MANIFEST.MF | 1 + .../localization/glsl/colormap.glsl | 43 +- .../localization/glsl/colormapRaster.glsl | 56 ++ .../localization/glsl/include/colorUtil.glsl | 34 + .../localization/glsl/include/indexing.glsl | 104 +++ .../localization/glsl/raster.glsl | 169 +--- .../localization/glsl/singleColor.glsl | 13 + .../localization/glsl_old/clouds.glsl | 59 -- .../localization/glsl_old/drawRaster.glsl | 37 - .../localization/glsl_old/drawRaster3D.glsl | 98 --- .../localization/glsl_old/heatIndex.glsl | 56 -- .../localization/glsl_old/icing.glsl | 125 --- .../localization/glsl_old/main.glsl | 157 ---- .../localization/glsl_old/terrain.glsl | 19 - cave/com.raytheon.viz.core.gl/plugin.xml | 13 +- .../schema/shader.exsd | 85 --- .../raytheon/viz/core/gl/AbstractGLMesh.java | 234 ++++-- .../com/raytheon/viz/core/gl/Activator.java | 15 +- .../viz/core/gl/GLFactoryAdapter.java | 13 - .../viz/core/gl/GLGeometryPainter.java | 2 - .../com/raytheon/viz/core/gl/IGLTarget.java | 90 +-- .../raytheon/viz/core/gl/SharedCoordMap.java | 7 +- .../viz/core/gl/TextureLoaderJob.java | 210 ----- .../core/gl/dataformat/GLShortDataFormat.java | 2 +- .../dataformat/GLUnsignedShortDataFormat.java | 4 +- .../gl/ext/AbstractGLImagingExtension.java | 373 +++++++++ .../ext/GLOffscreenRenderingExtension.java | 25 +- .../glsl/AbstractGLSLImagingExtension.java} | 44 +- .../viz/core/gl/glsl/GLSLFactory.java | 106 +-- .../core/gl/glsl/GLSLRasterProgramLoader.java | 133 ---- .../viz/core/gl/glsl/GLShaderProgram.java | 175 ++--- .../gl/glsl/internal/GLProgramManager.java | 223 ++++-- .../viz/core/gl/images/AbstractGLImage.java | 70 +- .../viz/core/gl/images/GLCMTextureData.java | 2 +- .../core/gl/images/GLColormappedImage.java | 47 +- .../viz/core/gl/images/GLDelegateImage.java | 176 +++++ .../raytheon/viz/core/gl/images/GLImage.java | 63 +- .../core/gl/images/GLSingleColorImage.java | 70 ++ .../viz/core/gl/internal/GLMesh2DStrips.java | 121 +-- .../viz/core/gl/internal/GLTarget.java | 722 +++--------------- .../core/gl/internal/GLWireframeShape.java | 3 +- .../core/gl/internal/GLWireframeShape2D.java | 50 +- .../ext/GLColormapShadedShapeExtension.java | 2 +- .../ext/GLColormappedImageExtension.java | 191 ++++- .../ext/GLDefaultImagingExtension.java} | 63 +- .../gl/internal/ext/GLMapMeshExtension.java | 31 +- .../ext/GLSingleColorImageExtension.java | 114 +++ .../core/gl/objects/GLVertexBufferObject.java | 2 +- .../viz/core/graphing/GraphDescriptor.java | 50 +- .../rsc/displays/GriddedImageDisplay2.java | 3 +- .../viz/core/rsc/hdf5/AbstractTileSet.java | 88 +-- .../viz/core/rsc/hdf5/FileBasedTileSet.java | 4 +- .../viz/core/rsc/hdf5/MemoryBasedTileSet.java | 4 +- .../viz/core/rsc/jts/JTSCompiler.java | 5 +- .../raytheon/viz/core/topo/TopoTileSet.java | 3 +- .../grid/inv/GribRequestableLevelNode.java | 6 +- .../viz/grid/inv/ImportLevelNode.java | 7 +- .../grid/inv/RadarRequestableLevelNode.java | 6 +- .../raytheon/viz/grid/rsc/GridResource.java | 2 +- .../viz/grid/util/GribDataCubeAdapter.java | 392 ++-------- .../viz/pointdata/PlotModelGeneratorJob.java | 8 +- .../drawables/GeneralPointImageExtension.java | 2 +- .../drawables/IPointImageExtension.java | 3 +- .../viz/pointdata/rsc/PlotResource2.java | 6 +- .../viz/pointdata/util/HeightOfLevelNode.java | 4 +- .../pointdata/util/PointAccumLevelNode.java | 4 +- .../pointdata/util/PointDataCubeAdapter.java | 13 - .../pointdata/util/PointDataLevelNode.java | 6 +- .../viz/radar/rsc/AbstractRadarResource.java | 46 +- .../viz/radar/rsc/RadarImageResource.java | 145 ++-- .../radar/rsc/image/IRadialMeshExtension.java | 3 +- .../radar/rsc/image/RadarRadialResource.java | 9 +- .../radar/rsc/image/RadarRasterResource.java | 43 +- .../MergeRasterRadarMosaicRenderer.java | 2 +- .../rsc}/mosaic/RadarMosaicRenderer.java | 115 +-- ...n.java => RadarMosaicRendererFactory.java} | 40 +- .../radar/rsc/mosaic/RadarMosaicResource.java | 25 +- .../rsc/mosaic/RadarMosaicResourceData.java | 2 +- .../ext/IRadarMosaicImageExtension.java | 56 ++ .../viz/radar/ui/xy/RadarXYResource.java | 3 +- .../viz/radar/ui/xy/RadarXsectXYResource.java | 3 +- .../viz/satellite/rsc/SatBlendedResource.java | 8 +- .../satellite/rsc/SatFileBasedTileSet.java | 15 +- .../raytheon/viz/ui/VizWorkbenchManager.java | 16 + .../raytheon/viz/ui/panes/VizDisplayPane.java | 47 +- .../request/GetCoveragesRequest.java~HEAD | 32 +- .../persist/DefaultPathProvider.java | 32 +- .../geospatial/util}/WorldWrapChecker.java | 40 +- .../geospatial/util}/WorldWrapCorrector.java | 10 +- .../rsc/mosaic/rsc/RadarImageResource.java | 73 +- .../rsc/mosaic/rsc/RadarRadialResource.java | 14 +- .../rsc/ncradar/rsc/RadarImageResource.java | 65 +- .../rsc/image/RadarRasterResource.java | 25 +- .../satellite/rsc/McidasFileBasedTileSet.java | 84 +- 159 files changed, 5137 insertions(+), 5298 deletions(-) create mode 100644 cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/datastructure/DefaultDataCubeAdapter.java create mode 100644 cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ImagingSupport.java delete mode 100644 cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/SingleColorImage.java rename cave/{com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/CompReflShaderLoader.java => com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/IImagingExtension.java} (53%) rename cave/{com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/IShaderLoader.java => com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/ISingleColorImageExtension.java} (62%) create mode 100644 cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/TextureLoader.java create mode 100644 cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/ColormappedImage.java delete mode 100644 cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/ColormappedRenderedImageCallback.java create mode 100644 cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractPluginDataObjectResource.java delete mode 100644 cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/hdf5/MeshCalculatorJob.java create mode 100644 cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/data/AbstractDataCubeAdapter.java delete mode 100644 cave/com.raytheon.uf.viz.radar.gl/localization/glsl/mosaicMinDist.glsl delete mode 100644 cave/com.raytheon.uf.viz.radar.gl/localization/glsl/mostRecentVal.glsl delete mode 100644 cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/MosaicGLTarget.java delete mode 100644 cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/RadarRadialMeshCache.java create mode 100644 cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/GLMosaicImage.java create mode 100644 cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/GLRadarMosaicImageExtension.java create mode 100644 cave/com.raytheon.viz.core.gl/localization/glsl/colormapRaster.glsl create mode 100644 cave/com.raytheon.viz.core.gl/localization/glsl/include/colorUtil.glsl create mode 100644 cave/com.raytheon.viz.core.gl/localization/glsl/include/indexing.glsl create mode 100644 cave/com.raytheon.viz.core.gl/localization/glsl/singleColor.glsl delete mode 100644 cave/com.raytheon.viz.core.gl/localization/glsl_old/clouds.glsl delete mode 100644 cave/com.raytheon.viz.core.gl/localization/glsl_old/drawRaster.glsl delete mode 100644 cave/com.raytheon.viz.core.gl/localization/glsl_old/drawRaster3D.glsl delete mode 100644 cave/com.raytheon.viz.core.gl/localization/glsl_old/heatIndex.glsl delete mode 100644 cave/com.raytheon.viz.core.gl/localization/glsl_old/icing.glsl delete mode 100644 cave/com.raytheon.viz.core.gl/localization/glsl_old/main.glsl delete mode 100644 cave/com.raytheon.viz.core.gl/localization/glsl_old/terrain.glsl delete mode 100644 cave/com.raytheon.viz.core.gl/schema/shader.exsd delete mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/TextureLoaderJob.java create mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/AbstractGLImagingExtension.java rename cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/{internal => }/ext/GLOffscreenRenderingExtension.java (91%) rename cave/{com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/GLRadarMosaicRendererFactory.java => com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/AbstractGLSLImagingExtension.java} (52%) delete mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/GLSLRasterProgramLoader.java create mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLDelegateImage.java create mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLSingleColorImage.java rename cave/{com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/MosaicShaderLoader.java => com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLDefaultImagingExtension.java} (51%) create mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLSingleColorImageExtension.java rename cave/{com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl => com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc}/mosaic/RadarMosaicRenderer.java (63%) rename cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/{ext/IRadarMosaicRendererFactoryExtension.java => RadarMosaicRendererFactory.java} (63%) create mode 100644 cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/ext/IRadarMosaicImageExtension.java rename cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/AbstractShaderLoader.java => edexOsgi/com.raytheon.uf.common.dataplugin.grib/src/com/raytheon/uf/common/dataplugin/grib/request/GetCoveragesRequest.java~HEAD (59%) rename {cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map => edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/util}/WorldWrapChecker.java (68%) rename {cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map => edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/util}/WorldWrapCorrector.java (96%) diff --git a/cave/com.raytheon.uf.viz.coopprecip/src/com/raytheon/uf/viz/coopprecip/CoopPrecipDataCubeAdapter.java b/cave/com.raytheon.uf.viz.coopprecip/src/com/raytheon/uf/viz/coopprecip/CoopPrecipDataCubeAdapter.java index 88823e4813..06e022dc1c 100644 --- a/cave/com.raytheon.uf.viz.coopprecip/src/com/raytheon/uf/viz/coopprecip/CoopPrecipDataCubeAdapter.java +++ b/cave/com.raytheon.uf.viz.coopprecip/src/com/raytheon/uf/viz/coopprecip/CoopPrecipDataCubeAdapter.java @@ -407,12 +407,6 @@ public class CoopPrecipDataCubeAdapter implements IDataCubeAdapter { return null; } - @Override - public String recordKeyGenerator(PluginDataObject pdo) { - // TODO Auto-generated method stub - return null; - } - @Override public void initInventory() { // TODO Auto-generated method stub diff --git a/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/rsc/AbstractDbMapResource.java b/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/rsc/AbstractDbMapResource.java index 4e05d37877..1439070318 100644 --- a/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/rsc/AbstractDbMapResource.java +++ b/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/rsc/AbstractDbMapResource.java @@ -87,6 +87,7 @@ public abstract class AbstractDbMapResource T getExtension(Class extensionClass) - throws VizException; + public abstract T getExtension( + Class extensionClass) throws VizException; + } diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/IMesh.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/IMesh.java index 7cc84e6d46..76bc8d189b 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/IMesh.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/IMesh.java @@ -19,14 +19,13 @@ **/ package com.raytheon.uf.viz.core; -import org.geotools.coverage.grid.GridGeometry2D; -import org.opengis.referencing.operation.MathTransform; +import org.geotools.coverage.grid.GeneralGridGeometry; -import com.raytheon.uf.viz.core.drawables.IRenderable; -import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; +import com.raytheon.uf.viz.core.exception.VizException; /** - * Base for any mesh 2D/3D, Quad/Triangle -- etc + * Base for any mesh 2D/3D, Quad/Triangle -- etc. See {@link PixelCoverage} / + * {@link DrawableImage} * *
  * SOFTWARE HISTORY
@@ -40,27 +39,7 @@ import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile;
  * @version 1.0
  */
 
-public interface IMesh extends IRenderable {
-
-    /**
-     * Calculate all the mesh vertices and texture coordinates
-     * 
-     * @param pc
-     * @param tile
-     * @param toLatLon
-     *            translate the tile coordinates to lat/lon coords if the tile
-     *            envelope is not already
-     */
-    public abstract void calculateMesh(PixelCoverage pc, ImageTile tile,
-            MathTransform toLatLon);
-
-    /**
-     * Calculate all the mesh vertices and texture coordinates
-     * 
-     * @param pc
-     * @param gg
-     */
-    public void calculateMesh(PixelCoverage pc, GridGeometry2D gg);
+public interface IMesh {
 
     /**
      * Dispose of the mesh data
@@ -73,4 +52,12 @@ public interface IMesh extends IRenderable {
      * @param extent
      */
     public boolean intersects(IExtent extent);
+
+    /**
+     * Reprojects the mesh into the new target geometry
+     * 
+     * @param targetGeometry
+     */
+    public void reproject(GeneralGridGeometry targetGeometry)
+            throws VizException;
 }
diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/data/prep/Colormapper.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/data/prep/Colormapper.java
index 4ad86cc5ba..dcd3e9c86d 100644
--- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/data/prep/Colormapper.java
+++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/data/prep/Colormapper.java
@@ -77,8 +77,6 @@ public class Colormapper {
         boolean log = parameters.isLogarithmic();
         double logFactor = parameters.getLogFactor();
         boolean mirror = parameters.isMirror();
-        double naturalMin = parameters.getDataMin();
-        double naturalMax = parameters.getDataMax();
         double cmapMin = parameters.getColorMapMin();
         double cmapMax = parameters.getColorMapMax();
         int colorMapSz = parameters.getColorMap().getSize();
diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/datastructure/DataCubeContainer.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/datastructure/DataCubeContainer.java
index ab9d43aef9..80ed0d1195 100644
--- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/datastructure/DataCubeContainer.java
+++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/datastructure/DataCubeContainer.java
@@ -34,7 +34,6 @@ import com.raytheon.uf.common.dataplugin.PluginDataObject;
 import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
 import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType;
 import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest;
-import com.raytheon.uf.common.dataquery.requests.TimeQueryRequestSet;
 import com.raytheon.uf.common.datastorage.Request;
 import com.raytheon.uf.common.datastorage.StorageException;
 import com.raytheon.uf.common.datastorage.records.IDataRecord;
@@ -42,10 +41,7 @@ import com.raytheon.uf.common.pointdata.PointDataContainer;
 import com.raytheon.uf.common.time.BinOffset;
 import com.raytheon.uf.common.time.DataTime;
 import com.raytheon.uf.viz.core.catalog.LayerProperty;
-import com.raytheon.uf.viz.core.catalog.ScriptCreator;
-import com.raytheon.uf.viz.core.comm.Loader;
 import com.raytheon.uf.viz.core.exception.VizException;
-import com.raytheon.uf.viz.core.requests.ThriftClient;
 
 /**
  * The DataCubeContainer is responsible for handling requests for data times,
@@ -101,7 +97,7 @@ public class DataCubeContainer {
         if (container.adapter != null) {
             synchronized (container.adapter) {
                 Boolean initialized = initializedMap.get(container.adapter);
-                if (!initialized) {
+                if (initialized == null || !initialized) {
                     container.adapter.initInventory();
                     initializedMap.put(container.adapter, true);
                 }
@@ -121,21 +117,9 @@ public class DataCubeContainer {
                 }
             }
         }
-    }
-
-    private IDataRecord[] getDataRecordInternal(PluginDataObject obj)
-            throws VizDataCubeException {
-        if (adapter != null) {
-            return adapter.getRecord(obj);
-        } else {
-            IDataRecord record = null;
-            try {
-                record = CubeUtil.retrieveData(obj, pluginName);
-            } catch (VizException e) {
-                throw new VizDataCubeException(
-                        "Error retrieving 2D grid record.", e);
-            }
-            return new IDataRecord[] { record };
+        if (adapter == null) {
+            // Construct default adapter for plugin if none found
+            adapter = new DefaultDataCubeAdapter(plugin);
         }
     }
 
@@ -153,23 +137,7 @@ public class DataCubeContainer {
      */
     public static IDataRecord[] getDataRecord(PluginDataObject obj)
             throws VizDataCubeException {
-        return getInstance(obj.getPluginName()).getDataRecordInternal(obj);
-    }
-
-    private IDataRecord[] getDataRecordInternal(PluginDataObject obj,
-            Request req, String dataset) throws VizDataCubeException {
-        if (adapter != null) {
-            return adapter.getRecord(obj, req, dataset);
-        } else {
-            IDataRecord record = null;
-            try {
-                record = CubeUtil.retrieveData(obj, pluginName, req, dataset);
-            } catch (VizException e) {
-                throw new VizDataCubeException(
-                        "Error retrieving 2D grid record.", e);
-            }
-            return new IDataRecord[] { record };
-        }
+        return getInstance(obj.getPluginName()).adapter.getRecord(obj);
     }
 
     /**
@@ -188,29 +156,10 @@ public class DataCubeContainer {
      */
     public static IDataRecord[] getDataRecord(PluginDataObject obj,
             Request req, String dataset) throws VizDataCubeException {
-        return getInstance(obj.getPluginName()).getDataRecordInternal(obj, req,
+        return getInstance(obj.getPluginName()).adapter.getRecord(obj, req,
                 dataset);
     }
 
-    private void getDataRecordsInternal(List objs,
-            Request req, String dataset) throws VizDataCubeException {
-        if (adapter != null) {
-            adapter.getRecords(objs, req, dataset);
-        } else {
-            for (PluginDataObject obj : objs) {
-                IDataRecord record = null;
-                try {
-                    record = CubeUtil.retrieveData(obj, pluginName, req,
-                            dataset);
-                } catch (VizException e) {
-                    throw new VizDataCubeException(
-                            "Error retrieving 2D grid record.", e);
-                }
-                obj.setMessageData(record);
-            }
-        }
-    }
-
     /**
      * For each PluginDataObject requests the DataRecords specified by Request
      * and dataSet and stores those DataRecords in the PluginDataObject message
@@ -238,41 +187,25 @@ public class DataCubeContainer {
                         "All PluginDataObjects must be for the same plugin");
             }
         }
-        getInstance(pluginName).getDataRecordsInternal(objs, req, dataset);
-    }
-
-    private PointDataContainer getPointDataInternal(String[] params,
-            Map map) throws VizException {
-        if (adapter != null) {
-            return adapter.getPoints(pluginName, params, map);
-        } else {
-            return null;
-        }
+        getInstance(pluginName).adapter.getRecords(objs, req, dataset);
     }
 
     public static PointDataContainer getPointData(String plugin,
             String[] params, Map map)
             throws VizException {
-        return getInstance(plugin).getPointDataInternal(params, map);
-    }
-
-    private PointDataContainer getPointDataInternal(String[] params,
-            String levelKey, Map map)
-            throws VizException {
-        if (levelKey == null) {
-            return getPointData(pluginName, params, map);
-        }
-        if (adapter != null) {
-            return adapter.getPoints(pluginName, params, levelKey, map);
-        } else {
-            return null;
-        }
+        DataCubeContainer container = getInstance(plugin);
+        return container.adapter.getPoints(container.pluginName, params, map);
     }
 
     public static PointDataContainer getPointData(String plugin,
             String[] params, String levelKey, Map map)
             throws VizException {
-        return getInstance(plugin).getPointDataInternal(params, levelKey, map);
+        DataCubeContainer container = getInstance(plugin);
+        if (levelKey == null) {
+            return getPointData(container.pluginName, params, map);
+        }
+        return container.adapter.getPoints(container.pluginName, params,
+                levelKey, map);
     }
 
     public static DataTime[] performTimeQuery(
@@ -308,20 +241,6 @@ public class DataCubeContainer {
                 new DataTime[0]);
     }
 
-    public List> performTimeQueriesInternal(
-            List requests) throws VizException {
-        if (adapter == null) {
-            TimeQueryRequestSet set = new TimeQueryRequestSet();
-            set.setRequests(requests.toArray(new TimeQueryRequest[0]));
-            @SuppressWarnings("unchecked")
-            List> result = (List>) ThriftClient
-                    .sendRequest(set);
-            return result;
-        } else {
-            return adapter.timeQuery(requests);
-        }
-    }
-
     /**
      * Perform a bulk time query request when all requests have the same plugin
      * type.
@@ -334,7 +253,7 @@ public class DataCubeContainer {
         if (requests.isEmpty()) {
             return Collections.emptyList();
         }
-        return getInstance(pluginName).performTimeQueriesInternal(requests);
+        return getInstance(pluginName).adapter.timeQuery(requests);
     }
 
     /**
@@ -346,8 +265,8 @@ public class DataCubeContainer {
      */
     public static List> performTimeQueries(String pluginName,
             TimeQueryRequest... requests) throws VizException {
-        return getInstance(pluginName).performTimeQueriesInternal(
-                Arrays.asList(requests));
+        return getInstance(pluginName).adapter.timeQuery(Arrays
+                .asList(requests));
     }
 
     /**
@@ -403,17 +322,6 @@ public class DataCubeContainer {
         return result;
     }
 
-    private synchronized List getDataInternal(LayerProperty property,
-            int timeOut) throws VizException {
-        if (adapter == null) {
-            String scriptToExecute = ScriptCreator.createScript(property);
-            return Loader
-                    .loadScripts(new String[] { scriptToExecute }, timeOut);
-        } else {
-            return adapter.getData(property, timeOut);
-        }
-    }
-
     /**
      * Returns a list of responses for the requested layer property. If a
      * derived parameter, this will piece together the base parameteters.
@@ -432,31 +340,11 @@ public class DataCubeContainer {
                 .getEntryQueryParameters(false);
         String pluginName = originalQuery.get("pluginName")
                 .getConstraintValue();
-        return getInstance(pluginName).getDataInternal(property, timeOut);
-    }
-
-    private Object getInventoryInternal() {
-        if (adapter != null) {
-            return adapter.getInventory();
-        } else {
-            return null;
-        }
+        return getInstance(pluginName).adapter.getData(property, timeOut);
     }
 
     public static Object getInventory(String plugin) {
-        return getInstance(plugin).getInventoryInternal();
-    }
-
-    private List> getBaseUpdateConstraintsInternal(
-            Map constraints) {
-        if (adapter != null) {
-            return adapter.getBaseUpdateConstraints(constraints);
-        } else {
-            List> result = new ArrayList>(
-                    1);
-            result.add(constraints);
-            return result;
-        }
+        return getInstance(plugin).adapter.getInventory();
     }
 
     public static List> getBaseUpdateConstraints(
@@ -467,8 +355,8 @@ public class DataCubeContainer {
                 && pluginRC.getConstraintType() == ConstraintType.EQUALS) {
             plugin = pluginRC.getConstraintValue();
         }
-        return getInstance(plugin)
-                .getBaseUpdateConstraintsInternal(constraints);
+        return getInstance(plugin).adapter
+                .getBaseUpdateConstraints(constraints);
     }
 
 }
diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/datastructure/DefaultDataCubeAdapter.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/datastructure/DefaultDataCubeAdapter.java
new file mode 100644
index 0000000000..c76bd0db1b
--- /dev/null
+++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/datastructure/DefaultDataCubeAdapter.java
@@ -0,0 +1,239 @@
+/**
+ * This software was developed and / or modified by Raytheon Company,
+ * pursuant to Contract DG133W-05-CQ-1067 with the US Government.
+ * 
+ * U.S. EXPORT CONTROLLED TECHNICAL DATA
+ * This software product contains export-restricted data whose
+ * export/transfer/disclosure is restricted by U.S. law. Dissemination
+ * to non-U.S. persons whether in the United States or abroad requires
+ * an export license or other authorization.
+ * 
+ * Contractor Name:        Raytheon Company
+ * Contractor Address:     6825 Pine Street, Suite 340
+ *                         Mail Stop B8
+ *                         Omaha, NE 68106
+ *                         402.291.0100
+ * 
+ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for
+ * further licensing information.
+ **/
+package com.raytheon.uf.viz.core.datastructure;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import com.raytheon.uf.common.dataplugin.PluginDataObject;
+import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
+import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest;
+import com.raytheon.uf.common.dataquery.requests.TimeQueryRequestSet;
+import com.raytheon.uf.common.datastorage.Request;
+import com.raytheon.uf.common.datastorage.records.IDataRecord;
+import com.raytheon.uf.common.pointdata.PointDataContainer;
+import com.raytheon.uf.common.time.DataTime;
+import com.raytheon.uf.viz.core.catalog.LayerProperty;
+import com.raytheon.uf.viz.core.catalog.ScriptCreator;
+import com.raytheon.uf.viz.core.comm.Loader;
+import com.raytheon.uf.viz.core.exception.VizException;
+import com.raytheon.uf.viz.core.requests.ThriftClient;
+
+/**
+ * Default implementation of IDataCubeAdapter, function implementations were
+ * moved from DataCubeContainer into here
+ * 
+ * 
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Dec 7, 2011            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class DefaultDataCubeAdapter implements IDataCubeAdapter { + + private String pluginName; + + public DefaultDataCubeAdapter(String pluginName) { + this.pluginName = pluginName; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getSupportedPlugins + * () + */ + @Override + public String[] getSupportedPlugins() { + return new String[] { pluginName }; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#timeQuery(java + * .util.List) + */ + @Override + public List> timeQuery(List requests) + throws VizException { + TimeQueryRequestSet set = new TimeQueryRequestSet(); + set.setRequests(requests.toArray(new TimeQueryRequest[0])); + @SuppressWarnings("unchecked") + List> result = (List>) ThriftClient + .sendRequest(set); + return result; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getPoints(java + * .lang.String, java.lang.String[], java.util.Map) + */ + @Override + public PointDataContainer getPoints(String plugin, String[] parameters, + Map queryParams) throws VizException { + return null; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getPoints(java + * .lang.String, java.lang.String[], java.lang.String, java.util.Map) + */ + @Override + public PointDataContainer getPoints(String plugin, String[] parameters, + String levelKey, Map queryParams) + throws VizException { + return null; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getRecord(com + * .raytheon.uf.common.dataplugin.PluginDataObject) + */ + @Override + public IDataRecord[] getRecord(PluginDataObject obj) + throws VizDataCubeException { + IDataRecord record = null; + try { + record = CubeUtil.retrieveData(obj, pluginName); + } catch (VizException e) { + throw new VizDataCubeException("Error retrieving 2D data record.", + e); + } + return new IDataRecord[] { record }; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getRecord(com + * .raytheon.uf.common.dataplugin.PluginDataObject, + * com.raytheon.uf.common.datastorage.Request, java.lang.String) + */ + @Override + public IDataRecord[] getRecord(PluginDataObject obj, Request req, + String dataset) throws VizDataCubeException { + IDataRecord record = null; + try { + record = CubeUtil.retrieveData(obj, pluginName, req, dataset); + } catch (VizException e) { + throw new VizDataCubeException("Error retrieving 2D data record.", + e); + } + return new IDataRecord[] { record }; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getRecords(java + * .util.List, com.raytheon.uf.common.datastorage.Request, java.lang.String) + */ + @Override + public void getRecords(List objs, Request req, + String dataset) throws VizDataCubeException { + for (PluginDataObject obj : objs) { + IDataRecord record = null; + try { + record = CubeUtil.retrieveData(obj, pluginName, req, dataset); + } catch (VizException e) { + throw new VizDataCubeException( + "Error retrieving 2D grid record.", e); + } + obj.setMessageData(record); + } + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getData(com.raytheon + * .uf.viz.core.catalog.LayerProperty, int) + */ + @Override + public List getData(LayerProperty property, int timeOut) + throws VizException { + String scriptToExecute = ScriptCreator.createScript(property); + return Loader.loadScripts(new String[] { scriptToExecute }, timeOut); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#initInventory() + */ + @Override + public void initInventory() { + // TODO Auto-generated method stub + + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getInventory() + */ + @Override + public Object getInventory() { + // TODO Auto-generated method stub + return null; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter# + * getBaseUpdateConstraints(java.util.Map) + */ + @Override + public List> getBaseUpdateConstraints( + Map constraints) { + List> result = new ArrayList>( + 1); + result.add(constraints); + return result; + } + +} diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/datastructure/IDataCubeAdapter.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/datastructure/IDataCubeAdapter.java index 9a46c46216..bfe563f73a 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/datastructure/IDataCubeAdapter.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/datastructure/IDataCubeAdapter.java @@ -145,16 +145,6 @@ public interface IDataCubeAdapter { public List getData(LayerProperty property, int timeOut) throws VizException; - /** - * A simple method that will create a unique string based on the information - * in the PluginDataObject passed in. - * - * @param pdo - * The PDO to generate a unique name from - * @return A string unique to that PDO - */ - public String recordKeyGenerator(PluginDataObject pdo); - /** * If the inventory for a particular data type is large (for example, Grib), * a call to this method should get a copy of that data type's inventory diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/AbstractDescriptor.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/AbstractDescriptor.java index 9e3c1374cf..3e73a920a4 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/AbstractDescriptor.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/AbstractDescriptor.java @@ -31,7 +31,22 @@ import java.util.concurrent.ConcurrentHashMap; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import org.geotools.coverage.grid.GeneralGridEnvelope; +import org.geotools.coverage.grid.GeneralGridGeometry; +import org.geotools.coverage.grid.GridGeometry2D; +import org.geotools.geometry.GeneralEnvelope; +import org.geotools.referencing.CRS; +import org.geotools.referencing.operation.DefaultMathTransformFactory; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.crs.GeneralDerivedCRS; +import org.opengis.referencing.datum.PixelInCell; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.TransformException; + +import com.raytheon.uf.common.serialization.adapters.GridGeometryAdapter; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; @@ -39,6 +54,7 @@ import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.AbstractTimeMatcher; import com.raytheon.uf.viz.core.IDisplayPane; import com.raytheon.uf.viz.core.IDisplayPaneContainer; +import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.VizConstants; import com.raytheon.uf.viz.core.datastructure.LoopProperties; import com.raytheon.uf.viz.core.exception.VizException; @@ -111,6 +127,19 @@ public abstract class AbstractDescriptor extends ResourceGroup implements /** The frame coordination object */ protected IFrameCoordinator frameCoordinator; + private MathTransform worldToPixel; + + private MathTransform pixelToWorld; + + /** The spatial grid for the descriptor */ + private GeneralGridGeometry gridGeometry; + + public AbstractDescriptor(GeneralGridGeometry gridGeometry) { + this(); + this.gridGeometry = gridGeometry; + init(); + } + /** * Constructor */ @@ -196,7 +225,8 @@ public abstract class AbstractDescriptor extends ResourceGroup implements protected void preAddListener(ResourcePair rp) throws WrongProjectionException { - AbstractVizResource resource = rp.getResource(); + AbstractVizResource resource = (AbstractVizResource) rp + .getResource(); resource.setDescriptor(this); @@ -654,6 +684,119 @@ public abstract class AbstractDescriptor extends ResourceGroup implements return frameCoordinator; } + private void init() { + GeneralGridGeometry gridGeometry = getGridGeometry(); + MathTransform worldToCRS = getWorldToCRSTransform(gridGeometry); + if (worldToCRS != null) { + try { + MathTransform crsToPixel = gridGeometry.getGridToCRS( + PixelInCell.CELL_CENTER).inverse(); + worldToPixel = new DefaultMathTransformFactory() + .createConcatenatedTransform(worldToCRS, crsToPixel); + pixelToWorld = worldToPixel.inverse(); + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, + "Error setting up Math Transforms," + + " this descriptor may not work properly", e); + } + } + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IDescriptor#getCRS() + */ + @Override + public final CoordinateReferenceSystem getCRS() { + if (gridGeometry != null && gridGeometry.getEnvelope() != null) { + return gridGeometry.getEnvelope().getCoordinateReferenceSystem(); + } else { + return null; + } + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IDescriptor#getGridGeometry() + */ + @Override + @XmlElement + @XmlJavaTypeAdapter(value = GridGeometryAdapter.class) + public final GeneralGridGeometry getGridGeometry() { + return gridGeometry; + } + + /** + * Set the grid geometry + * + * @param gridGeometry + * the gridGeometry to set + * @throws VizException + */ + public void setGridGeometry(GeneralGridGeometry gridGeometry) + throws VizException { + this.gridGeometry = gridGeometry; + init(); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.drawables.IDescriptor#pixelToWorld(double[]) + */ + @Override + public final double[] pixelToWorld(double[] pixel) { + double[] output = new double[3]; + double[] wpixel = pixel; + + if (pixel.length == 2) { + wpixel = new double[] { pixel[0], pixel[1], 0 }; + } + + if (pixelToWorld != null) { + try { + pixelToWorld.transform(wpixel, 0, output, 0, 1); + } catch (TransformException e) { + e.printStackTrace(); + return null; + } + } else { + System.arraycopy(wpixel, 0, output, 0, wpixel.length); + } + + return output; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.drawables.IDescriptor#worldToPixel(double[]) + */ + @Override + public final double[] worldToPixel(double[] world) { + double[] output = new double[3]; + double[] input = world; + if (world.length == 2) { + input = new double[] { world[0], world[1], 0 }; + } + + if (worldToPixel != null) { + try { + worldToPixel.transform(input, 0, output, 0, 1); + } catch (TransformException e) { + return null; + } + } else { + System.arraycopy(input, 0, output, 0, input.length); + } + + return output; + } + /* * (non-Javadoc) * @@ -683,4 +826,40 @@ public abstract class AbstractDescriptor extends ResourceGroup implements getFrameCoordinator().changeFrame(loopProperties); } + protected static GeneralGridGeometry createGridGeometry(IExtent extent, + CoordinateReferenceSystem crs) { + GeneralEnvelope envelope = new GeneralEnvelope(2); + envelope.setRange(0, extent.getMinX(), extent.getMaxX()); + envelope.setRange(1, extent.getMinY(), extent.getMaxY()); + envelope.setCoordinateReferenceSystem(crs); + return new GridGeometry2D( + new GeneralGridEnvelope(new int[] { 0, 0 }, new int[] { + (int) extent.getWidth(), (int) extent.getHeight() }, + false), envelope); + } + + /** + * Get the world to CRS transform used for {@link #worldToPixel(double[])} + * and {@link #pixelToWorld(double[])} + * + * @param gridGeometry + * @return The world to gridGeometry CRS transform or null if there is none + */ + public static MathTransform getWorldToCRSTransform( + GeneralGridGeometry gridGeometry) { + CoordinateReferenceSystem crs = gridGeometry.getEnvelope() + .getCoordinateReferenceSystem(); + if (crs instanceof GeneralDerivedCRS) { + GeneralDerivedCRS projCRS = (GeneralDerivedCRS) crs; + CoordinateReferenceSystem worldCRS = projCRS.getBaseCRS(); + try { + return CRS.findMathTransform(worldCRS, crs); + } catch (FactoryException e) { + statusHandler.handle(Priority.PROBLEM, + "Error setting up Math Transforms," + + " this descriptor may not work properly", e); + } + } + return null; + } } diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ColorMapLoader.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ColorMapLoader.java index 51c67cf27a..2de903912e 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ColorMapLoader.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ColorMapLoader.java @@ -206,8 +206,8 @@ public class ColorMapLoader { ColorMap cm = (ColorMap) SerializationUtil .jaxbUnmarshalFromXmlFile(colorMapFile.getFile() .getAbsolutePath()); - cm.setName(name); + cm.setChanged(false); return cm; } else { return null; diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ColorMapParameters.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ColorMapParameters.java index e3ea7f9db0..c3cd3ee7bc 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ColorMapParameters.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ColorMapParameters.java @@ -22,6 +22,8 @@ package com.raytheon.uf.viz.core.drawables; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import javax.measure.converter.UnitConverter; import javax.measure.unit.Unit; @@ -116,7 +118,7 @@ public class ColorMapParameters implements Cloneable, ISerializableObject { } - protected IColorMapParametersListener listener; + protected Set listeners = new HashSet(); /** Units of the colormap parameters (min/max) */ protected Unit displayUnit; @@ -714,13 +716,19 @@ public class ColorMapParameters implements Cloneable, ISerializableObject { } private void notifyListener() { - if (listener != null) { + for (IColorMapParametersListener listener : listeners) { listener.colorMapChanged(); } } - public void setListener(IColorMapParametersListener listener) { - this.listener = listener; + public void addListener(IColorMapParametersListener listener) { + if (listener != null) { + listeners.add(listener); + } + } + + public void removeListener(IColorMapParametersListener listener) { + listeners.remove(listener); } public void setAlphaMask(byte[] alphaMask) { @@ -741,8 +749,8 @@ public class ColorMapParameters implements Cloneable, ISerializableObject { @Override public int hashCode() { - if (listener != null) { - return listener.hashCode(); + if (listeners.size() > 0) { + return listeners.hashCode(); } else if (colorMap != null) { return colorMap.hashCode(); } else { diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/IImage.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/IImage.java index 4169563fcf..b6ce410f25 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/IImage.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/IImage.java @@ -20,6 +20,9 @@ package com.raytheon.uf.viz.core.drawables; +import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; +import com.raytheon.uf.viz.core.exception.VizException; + /** * Describes a generic Image resource. The IImage resource is an interface * handle to an image. The image resource manages the lifecycle of the @@ -63,6 +66,11 @@ public interface IImage { UNLOADED, STAGED, LOADED, LOADING, FAILED, INVALID }; + /** + * Stages any data required for the image to load/draw + */ + public abstract void stage() throws VizException; + /** * @return the status */ @@ -106,4 +114,10 @@ public interface IImage { */ public abstract void setContrast(float contrast); + /** + * Gets the extension class for this image + * + * @return + */ + public abstract Class getExtensionClass(); } \ No newline at end of file diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ImagingSupport.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ImagingSupport.java new file mode 100644 index 0000000000..764209e217 --- /dev/null +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ImagingSupport.java @@ -0,0 +1,143 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.viz.core.drawables; + +import java.util.ArrayList; +import java.util.List; + +import com.raytheon.uf.viz.core.DrawableImage; +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.IGraphicsTarget.RasterMode; +import com.raytheon.uf.viz.core.drawables.IImage.Status; +import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; +import com.raytheon.uf.viz.core.drawables.ext.TextureLoader; +import com.raytheon.uf.viz.core.exception.VizException; + +/** + * Support class for rendering images to a target + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Mar 13, 2012            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class ImagingSupport { + + protected static final TextureLoader textureLoader = TextureLoader + .getInstance(); + + /** + * Prepares images for painting by staging and/or targeting the image + * + * @param target + * @param images + * @throws VizException + */ + public static void prepareImages(IGraphicsTarget target, + DrawableImage... images) throws VizException { + for (DrawableImage di : images) { + IImage image = di.getImage(); + RasterMode mode = di.getMode(); + + if (image.getStatus() != Status.LOADED + && image.getStatus() != Status.STAGED) { + if (mode == RasterMode.ASYNCHRONOUS) { + textureLoader.requestLoad(image); + target.setNeedsRefresh(true); + } else if (mode == RasterMode.SYNCHRONOUS) { + image.stage(); + } + } + } + } + + /** + * Routes the images to be rendered by their proper extensions, expects + * images have already been "prepared" (Status=STAGED) + * + * @param target + * @param paintProps + * @param images + * @return + * @throws VizException + */ + public static boolean routeImages(IGraphicsTarget target, + PaintProperties paintProps, DrawableImage[] images) + throws VizException { + boolean rval = true; + boolean skipped = false; + List bulk = new ArrayList(); + Class lastExt = null; + for (DrawableImage di : images) { + IImage image = di.getImage(); + IImage.Status imageSts = image.getStatus(); + if (imageSts == IImage.Status.LOADED + || imageSts == IImage.Status.STAGED) { + Class imageExt = image + .getExtensionClass(); + if (imageExt.equals(lastExt) == false && bulk.size() > 0) { + DrawableImage[] extImages = bulk + .toArray(new DrawableImage[bulk.size()]); + // Render what we have + IImagingExtension impl = target.getExtension(lastExt); + rval &= impl.drawRasters(paintProps, extImages); + bulk.clear(); + } + + bulk.add(di); + lastExt = imageExt; + } else { + skipped = true; + } + } + + if (bulk.size() > 0) { + // Render what is left + IImagingExtension impl = target.getExtension(lastExt); + rval &= impl.drawRasters(paintProps, + bulk.toArray(new DrawableImage[bulk.size()])); + } + + return rval & skipped; + } + + /** + * Prepares the images, then routes them for rendering + * + * @param paintProps + * @param images + * @return + */ + public static boolean drawRasters(IGraphicsTarget target, + PaintProperties paintProps, DrawableImage[] images) + throws VizException { + prepareImages(target, images); + return routeImages(target, paintProps, images); + } +} diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/SingleColorImage.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/SingleColorImage.java deleted file mode 100644 index 44ed0d2e9b..0000000000 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/SingleColorImage.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.raytheon.uf.viz.core.drawables; - -import org.eclipse.swt.graphics.RGB; - -public class SingleColorImage implements IImage { - - private IImage image = null; - - private RGB color = null; - - public IImage getWrappedImage() { - return image; - } - - public void setWrappedImage(IImage image) { - this.image = image; - } - - public void setColor(RGB color) { - this.color = color; - } - - public RGB getColor() { - return color; - } - - public SingleColorImage(IImage image) { - this.image = image; - } - - @Override - public Status getStatus() { - return image.getStatus(); - } - - @Override - public void setInterpolated(boolean isInterpolated) { - image.setInterpolated(isInterpolated); - } - - @Override - public void dispose() { - image.dispose(); - } - - @Override - public int getWidth() { - return image.getWidth(); - } - - @Override - public int getHeight() { - return image.getHeight(); - } - - @Override - public void setBrightness(float brightness) { - image.setBrightness(brightness); - } - - @Override - public void setContrast(float contrast) { - image.setContrast(contrast); - } - -} diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/GraphicsExtension.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/GraphicsExtension.java index 9e0a79bdd7..adf101661a 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/GraphicsExtension.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/GraphicsExtension.java @@ -40,15 +40,22 @@ import com.raytheon.uf.viz.core.IGraphicsTarget; */ public abstract class GraphicsExtension { - public static enum Compatibilty { - INCOMPATIBLE(-1), GENERIC(0), TARGET_COMPATIBLE(1000), ENHANCED_TARGET_COMPATIBLE( - 2000); + /** + * Interface that other interfaces should extend if they want to be used as + * a graphics extension + */ + public static interface IGraphicsExtensionInterface { - public int value; + } - private Compatibilty(int value) { - this.value = value; - } + public static class Compatibilty { + public static final int INCOMPATIBLE = -1; + + public static final int GENERIC = 0; + + public static final int TARGET_COMPATIBLE = 1000; + + public static final int ENHANCED_TARGET_COMPATIBLE = 2000; } protected T target; @@ -69,12 +76,19 @@ public abstract class GraphicsExtension { public final int setTarget(IGraphicsTarget target) { try { this.target = (T) target; + return getCompatibilityValue(this.target); } catch (ClassCastException e) { - return Compatibilty.INCOMPATIBLE.value; + this.target = null; + return Compatibilty.INCOMPATIBLE; } - return getCompatibilityValue(this.target); } + /** + * Get the target compability value. + * + * @param target + * @return + */ public abstract int getCompatibilityValue(T target); /** diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/GraphicsExtensionManager.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/GraphicsExtensionManager.java index a33b5b85b4..a94086ac81 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/GraphicsExtensionManager.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/GraphicsExtensionManager.java @@ -15,6 +15,7 @@ import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface; import com.raytheon.uf.viz.core.exception.VizException; public class GraphicsExtensionManager { @@ -67,8 +68,8 @@ public class GraphicsExtensionManager { * @return * @throws VizException */ - public synchronized T getExtension(Class extensionClass) - throws VizException { + public synchronized T getExtension( + Class extensionClass) throws VizException { if (cached.containsKey(extensionClass)) { return extensionClass.cast(cached.get(extensionClass)); } @@ -76,10 +77,14 @@ public class GraphicsExtensionManager { int bestVal = -1; for (Class eClass : extensions) { if (extensionClass.isAssignableFrom(eClass)) { - GraphicsExtension graphicsExt; try { - graphicsExt = GraphicsExtension.class.cast(eClass + GraphicsExtension graphicsExt = GraphicsExtension.class.cast(eClass .newInstance()); + int val = graphicsExt.setTarget(target); + if (val > bestVal) { + bestVal = val; + bestExt = extensionClass.cast(graphicsExt); + } } catch (InstantiationException e) { statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e); @@ -89,11 +94,6 @@ public class GraphicsExtensionManager { e.getLocalizedMessage(), e); continue; } - int val = graphicsExt.setTarget(target); - if (val > bestVal) { - bestVal = val; - bestExt = extensionClass.cast(graphicsExt); - } } } if (bestExt != null) { diff --git a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/CompReflShaderLoader.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/IImagingExtension.java similarity index 53% rename from cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/CompReflShaderLoader.java rename to cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/IImagingExtension.java index ccf30b9e6b..c5ce18bde2 100644 --- a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/CompReflShaderLoader.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/IImagingExtension.java @@ -17,24 +17,23 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.uf.viz.radar.gl.mosaic; +package com.raytheon.uf.viz.core.drawables.ext; -import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.DrawableImage; import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.gl.IGLTarget; -import com.raytheon.viz.core.gl.glsl.AbstractShaderLoader; -import com.raytheon.viz.core.gl.glsl.GLShaderProgram; /** - * TODO Add Description + * Interface extensions that return IImage objects should implement * *
  * 
  * SOFTWARE HISTORY
+ * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
- * Sep 20, 2010            mschenke     Initial creation
+ * Dec 15, 2011            mschenke     Initial creation
  * 
  * 
* @@ -42,22 +41,17 @@ import com.raytheon.viz.core.gl.glsl.GLShaderProgram; * @version 1.0 */ -public class CompReflShaderLoader extends AbstractShaderLoader { +public interface IImagingExtension extends IGraphicsExtensionInterface { - /* - * (non-Javadoc) + /** + * Draw the images passed in * - * @see - * com.raytheon.viz.core.gl.glsl.IShaderLoader#loadData(com.raytheon.viz - * .core.gl.IGLTarget, com.raytheon.viz.core.gl.glsl.GLShaderProgram, - * com.raytheon.uf.viz.core.drawables.IImage, - * com.raytheon.uf.viz.core.drawables.PaintProperties) + * @param paintProps + * @param images + * @return whether all images were drawn or not + * @throws VizException */ - @Override - public void loadData(IGLTarget target, GLShaderProgram program, - IImage image, PaintProperties paintProps) throws VizException { - // load radar data to GL_TEXTURE0 (bound in drawRaster) - program.setUniform("radarData", 0); - } + public boolean drawRasters(PaintProperties paintProps, + DrawableImage... images) throws VizException; } diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/IOffscreenRenderingExtension.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/IOffscreenRenderingExtension.java index 3afc85fd54..778028c21f 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/IOffscreenRenderingExtension.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/IOffscreenRenderingExtension.java @@ -4,9 +4,11 @@ import java.nio.Buffer; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface; import com.raytheon.uf.viz.core.exception.VizException; -public interface IOffscreenRenderingExtension { +public interface IOffscreenRenderingExtension extends + IGraphicsExtensionInterface { /** * All drawing between a call to renderOffscreen and the next call to * renderOnscreen will be drawn to offscreenImage rather than to the screen. diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/IShaderLoader.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/ISingleColorImageExtension.java similarity index 62% rename from cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/IShaderLoader.java rename to cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/ISingleColorImageExtension.java index 6d8a0533d8..7040c52203 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/IShaderLoader.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/ISingleColorImageExtension.java @@ -17,52 +17,49 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ +package com.raytheon.uf.viz.core.drawables.ext; -package com.raytheon.viz.core.gl.glsl; +import java.awt.image.RenderedImage; + +import org.eclipse.swt.graphics.RGB; + +import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.exception.VizException; /** - * Define common interface for vertex and fragement shaders. + * Extension for creating images that should be mapped to a single color * *
+ * 
  * SOFTWARE HISTORY
+ * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
- *  
+ * Dec 15, 2011            mschenke     Initial creation
  * 
  * 
* - * @author estrabal + * @author mschenke * @version 1.0 */ -import com.raytheon.uf.viz.core.drawables.IImage; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.gl.IGLTarget; +public interface ISingleColorImageExtension extends IImagingExtension { -public interface IShaderLoader { + public static interface ISingleColorImage extends IImage { + + public void setColor(RGB color); + + } /** + * Construct an ISingleColorImage image that maps the image passed into to + * the single color value * - * @return - */ - public abstract String getName(); - - /** - * - * @param name - */ - public abstract void setName(String name); - - /** - * load shader variables using IImage and PaintProperties - * - * @param target - * @param program * @param image - * @param paintProps + * @param color + * @return * @throws VizException */ - public abstract void loadData(IGLTarget target, GLShaderProgram program, - IImage image, PaintProperties paintProps) throws VizException; + public ISingleColorImage constructImage(RenderedImage image, RGB color); + } diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/TextureLoader.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/TextureLoader.java new file mode 100644 index 0000000000..44a7a6814f --- /dev/null +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/TextureLoader.java @@ -0,0 +1,129 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ + +package com.raytheon.uf.viz.core.drawables.ext; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.ui.services.IDisposable; + +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; +import com.raytheon.uf.viz.core.Activator; +import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.jobs.JobPool; + +/** + * Class that loads data for AbstractGLImages asynchronously + * + *
+ * 
+ *    SOFTWARE HISTORY
+ *   
+ *    Date          Ticket#     Engineer    Description
+ *    ------------	----------	-----------	--------------------------
+ *    7/1/06                    chammack    Initial Creation.
+ * 
+ * 
+ * + * @author chammack + * + */ +public class TextureLoader { + + private static final IUFStatusHandler statusHandler = UFStatus + .getHandler(TextureLoader.class); + + /** The instance */ + private static TextureLoader instance; + + private JobPool loaderPool; + + private List texturesToLoad; + + /** + * Get the currently running instance of the texture loader + * + * @return + */ + public static synchronized TextureLoader getInstance() { + if (instance == null) { + instance = new TextureLoader(); + } + return instance; + } + + /** + * Use getInstance() instead of constructor + * + */ + private TextureLoader() { + this.texturesToLoad = new ArrayList(); + this.loaderPool = new JobPool("Texture Loader", Runtime.getRuntime() + .availableProcessors(), true); + // Make sure we get shutdown properly + Activator.getDefault().registerDisposable(new IDisposable() { + @Override + public void dispose() { + shutdown(); + } + }); + } + + /** + * Request an image to be loaded + * + * @param img + * the image + */ + public void requestLoad(final IImage img) { + if (!texturesToLoad.contains(img)) { + texturesToLoad.add(img); + loaderPool.schedule(new Runnable() { + @Override + public void run() { + try { + try { + img.stage(); + } catch (Throwable t) { + statusHandler.handle( + Priority.PROBLEM, + "Error staging texture: " + + t.getLocalizedMessage(), t); + } + } finally { + texturesToLoad.remove(img); + } + } + }); + } + } + + /** + * Request the job to be shut down + * + */ + public void shutdown() { + loaderPool.cancel(); + } + +} diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/ColormappedImage.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/ColormappedImage.java new file mode 100644 index 0000000000..465f2c3ecd --- /dev/null +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/ColormappedImage.java @@ -0,0 +1,240 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.viz.core.drawables.ext.colormap; + +import java.awt.image.RenderedImage; + +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; +import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback.ColorMapData; +import com.raytheon.uf.viz.core.data.IRenderedImageCallback; +import com.raytheon.uf.viz.core.data.prep.Colormapper; +import com.raytheon.uf.viz.core.drawables.ColorMapParameters; +import com.raytheon.uf.viz.core.drawables.IColorMapParametersListener; +import com.raytheon.uf.viz.core.drawables.IColormappedImage; +import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; +import com.raytheon.uf.viz.core.exception.VizException; + +/** + * General colormapped image, regenerates image if parameters change + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Dec 16, 2011            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class ColormappedImage implements IColormappedImage, + IRenderedImageCallback, IColorMapParametersListener { + + private IImage image; + + private IColorMapDataRetrievalCallback callback; + + private ColorMapParameters parameters; + + public ColormappedImage(IGraphicsTarget target, + IColorMapDataRetrievalCallback callback, + ColorMapParameters parameters) { + this.callback = callback; + setColorMapParameters(parameters); + image = target.initializeRaster(this); + } + + /** + * Get the wrapped image for the colormapped image + * + * @return + */ + public IImage getWrappedImage() { + return image; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#getStatus() + */ + @Override + public Status getStatus() { + return image.getStatus(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#setInterpolated(boolean) + */ + @Override + public void setInterpolated(boolean isInterpolated) { + image.setInterpolated(isInterpolated); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#dispose() + */ + @Override + public void dispose() { + if (image != null) { + image.dispose(); + } + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#getWidth() + */ + @Override + public int getWidth() { + return image.getWidth(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#getHeight() + */ + @Override + public int getHeight() { + return image.getHeight(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#setBrightness(float) + */ + @Override + public void setBrightness(float brightness) { + image.setBrightness(brightness); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#setContrast(float) + */ + @Override + public void setContrast(float contrast) { + image.setContrast(contrast); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#getExtensionClass() + */ + @Override + public Class getExtensionClass() { + return GeneralColormappedImageExtension.class; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.drawables.IColormappedImage#getColorMapParameters + * () + */ + @Override + public ColorMapParameters getColorMapParameters() { + return parameters; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.drawables.IColormappedImage#setColorMapParameters + * (com.raytheon.uf.viz.core.drawables.ColorMapParameters) + */ + @Override + public void setColorMapParameters(ColorMapParameters params) { + if (params != this.parameters) { + if (this.parameters != null) { + this.parameters.removeListener(this); + } + this.parameters = params; + if (this.parameters != null) { + this.parameters.addListener(this); + } + dispose(); + } + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IColormappedImage#getValue(int, + * int) + */ + @Override + public double getValue(int x, int y) { + return Double.NaN; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.data.IRenderedImageCallback#getImage() + */ + @Override + public RenderedImage getImage() throws VizException { + if (parameters == null || parameters.getColorMap() == null) { + return null; + } + ColorMapData colorMapData = callback.getColorMapData(); + return Colormapper.colorMap(colorMapData, parameters); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IColorMapParametersListener# + * colorMapChanged() + */ + @Override + public void colorMapChanged() { + dispose(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#stage() + */ + @Override + public void stage() throws VizException { + image.stage(); + } + +} diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/ColormappedRenderedImageCallback.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/ColormappedRenderedImageCallback.java deleted file mode 100644 index 69f039b12d..0000000000 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/ColormappedRenderedImageCallback.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ -package com.raytheon.uf.viz.core.drawables.ext.colormap; - -import java.awt.image.RenderedImage; - -import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; -import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback.ColorMapData; -import com.raytheon.uf.viz.core.data.IRenderedImageCallback; -import com.raytheon.uf.viz.core.data.prep.Colormapper; -import com.raytheon.uf.viz.core.drawables.ColorMapParameters; -import com.raytheon.uf.viz.core.exception.VizException; - -/** - * General {@link IRenderedImageCallback} that takes a - * {@link IColorMapDataRetrievalCallback} and {@link ColorMapParameters} and - * will colormap the data returned from the callback into a - * {@link RenderedImage} - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Nov 22, 2011            mschenke     Initial creation
- * 
- * 
- * - * @author mschenke - * @version 1.0 - */ - -public class ColormappedRenderedImageCallback implements IRenderedImageCallback { - - private IColorMapDataRetrievalCallback callback; - - private ColorMapParameters parameters; - - /** - * Construct a ColormappedRenderedImageCallback for the colormap data - * callback and parameters - * - * @param dataCallback - * @param parameters - */ - public ColormappedRenderedImageCallback( - IColorMapDataRetrievalCallback dataCallback, - ColorMapParameters parameters) { - this.callback = dataCallback; - this.parameters = parameters; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.data.IRenderedImageCallback#getImage() - */ - @Override - public RenderedImage getImage() throws VizException { - ColorMapData colorMapData = callback.getColorMapData(); - return Colormapper.colorMap(colorMapData, parameters); - } -} diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/GeneralColormappedImageExtension.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/GeneralColormappedImageExtension.java index c2d8f4d59a..ed10191d42 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/GeneralColormappedImageExtension.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/GeneralColormappedImageExtension.java @@ -19,11 +19,17 @@ **/ package com.raytheon.uf.viz.core.drawables.ext.colormap; +import java.util.ArrayList; +import java.util.List; + +import com.raytheon.uf.viz.core.DrawableImage; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; -import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.drawables.IColormappedImage; +import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension; +import com.raytheon.uf.viz.core.exception.VizException; /** * General colormapped image extension. Uses @@ -56,10 +62,10 @@ public class GeneralColormappedImageExtension extends * com.raytheon.uf.viz.core.drawables.ColorMapParameters) */ @Override - public IImage initializeRaster(IColorMapDataRetrievalCallback dataCallback, + public IColormappedImage initializeRaster( + IColorMapDataRetrievalCallback dataCallback, ColorMapParameters colorMapParameters) { - return target.initializeRaster(new ColormappedRenderedImageCallback( - dataCallback, colorMapParameters)); + return new ColormappedImage(target, dataCallback, colorMapParameters); } /* @@ -70,7 +76,29 @@ public class GeneralColormappedImageExtension extends */ @Override public int getCompatibilityValue(IGraphicsTarget target) { - return Compatibilty.GENERIC.value; + return Compatibilty.GENERIC; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.drawables.ext.IImagingExtension#drawRasters( + * com.raytheon.uf.viz.core.drawables.PaintProperties, + * com.raytheon.uf.viz.core.DrawableImage[]) + */ + @Override + public boolean drawRasters(PaintProperties paintProps, + DrawableImage... images) throws VizException { + List renderables = new ArrayList(); + for (DrawableImage di : images) { + if (di.getImage() instanceof ColormappedImage) { + renderables.add(new DrawableImage(((ColormappedImage) di + .getImage()).getWrappedImage(), di.getCoverage())); + } + } + return target.drawRasters(paintProps, + renderables.toArray(new DrawableImage[renderables.size()])); } } diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/IColormapShadedShapeExtension.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/IColormapShadedShapeExtension.java index 0860efeddb..7ecf788352 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/IColormapShadedShapeExtension.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/IColormapShadedShapeExtension.java @@ -26,6 +26,7 @@ import org.eclipse.swt.graphics.RGB; import com.raytheon.uf.viz.core.drawables.IDescriptor; import com.raytheon.uf.viz.core.drawables.IShadedShape; +import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface; import com.raytheon.uf.viz.core.exception.VizException; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.LineString; @@ -53,7 +54,8 @@ import com.vividsolutions.jts.geom.LineString; * @author bsteffen * @version 1.0 */ -public interface IColormapShadedShapeExtension { +public interface IColormapShadedShapeExtension extends + IGraphicsExtensionInterface { public interface IColormapShadedShape { diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/IColormappedImageExtension.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/IColormappedImageExtension.java index 2270e74972..fb63e8ea8e 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/IColormappedImageExtension.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/IColormappedImageExtension.java @@ -22,7 +22,7 @@ package com.raytheon.uf.viz.core.drawables.ext.colormap; import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.IColormappedImage; -import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; /** * Extension for creating {@link IColormappedImage} objects @@ -41,7 +41,7 @@ import com.raytheon.uf.viz.core.drawables.IImage; * @version 1.0 */ -public interface IColormappedImageExtension { +public interface IColormappedImageExtension extends IImagingExtension { /** * Initializes an IColormappedImage given the dataCallback and colormap @@ -51,6 +51,7 @@ public interface IColormappedImageExtension { * @param colorMapParameters * @return */ - public IImage initializeRaster(IColorMapDataRetrievalCallback dataCallback, + public IColormappedImage initializeRaster( + IColorMapDataRetrievalCallback dataCallback, ColorMapParameters colorMapParameters); } diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/IMapMeshExtension.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/IMapMeshExtension.java index 431084a4d3..4734015c64 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/IMapMeshExtension.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/IMapMeshExtension.java @@ -19,7 +19,12 @@ **/ package com.raytheon.uf.viz.core.map; +import org.geotools.coverage.grid.GeneralGridGeometry; +import org.geotools.coverage.grid.GridGeometry2D; + import com.raytheon.uf.viz.core.IMesh; +import com.raytheon.uf.viz.core.drawables.IDescriptor; +import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface; import com.raytheon.uf.viz.core.exception.VizException; /** @@ -39,17 +44,31 @@ import com.raytheon.uf.viz.core.exception.VizException; * @version 1.0 */ -public interface IMapMeshExtension { +public interface IMapMeshExtension extends IGraphicsExtensionInterface { /** - * Create a mesh - * - * @param descriptor + * Constructs a mesh for mapping the imageGeometry onto the targetGeometry * + * @param imageGeometry + * @param targetGeometry * @return * @throws VizException */ - public abstract IMesh constructMesh(IMapDescriptor descriptor) - throws VizException; + public abstract IMesh constructMesh(GridGeometry2D imageGeometry, + GeneralGridGeometry targetGeometry) throws VizException; + + /** + * Convenient method for constructing a mesh for mapping the imageGeometry + * onto the targetDescriptor. Same as calling + * {@link #constructMesh(GridGeometry2D, GeneralGridGeometry)} passing in + * target.getGridGeometry() + * + * @param imageGeometry + * @param targetDescriptor + * @return + * @throws VizException + */ + public abstract IMesh constructMesh(GridGeometry2D imageGeometry, + IDescriptor targetDescriptor) throws VizException; } diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/MapDescriptor.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/MapDescriptor.java index c3020ac608..fffc07272e 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/MapDescriptor.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/MapDescriptor.java @@ -26,9 +26,7 @@ import java.util.ArrayList; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.eclipse.swt.graphics.RGB; import org.geotools.coverage.grid.GeneralGridEnvelope; @@ -36,23 +34,16 @@ import org.geotools.coverage.grid.GeneralGridGeometry; import org.geotools.coverage.grid.GridGeometry2D; import org.geotools.geometry.DirectPosition2D; import org.geotools.geometry.GeneralEnvelope; -import org.geotools.referencing.CRS; import org.geotools.referencing.GeodeticCalculator; -import org.geotools.referencing.crs.DefaultGeocentricCRS; -import org.geotools.referencing.crs.DefaultGeographicCRS; -import org.geotools.referencing.operation.DefaultMathTransformFactory; import org.opengis.geometry.DirectPosition; import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.datum.PixelInCell; import org.opengis.referencing.operation.MathTransform; -import org.opengis.referencing.operation.MathTransformFactory; import org.opengis.referencing.operation.TransformException; -import com.raytheon.uf.common.geospatial.CRSCache; import com.raytheon.uf.common.geospatial.MapUtil; import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.adapters.GridGeometryAdapter; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; @@ -196,24 +187,12 @@ public class MapDescriptor extends AbstractDescriptor implements return gridGeom; } - /** The transform from lat/lon to the current CRS */ - protected MathTransform coordinateTransform; - - /** The transform from the current CRS to lat/lon */ - protected MathTransform inverseCoordinateTransform; - /** The mapping from grid to coordinate */ protected MathTransform mapToCoordinateTransform; /** The mapping from coordinate to grid */ protected MathTransform coordinateToMapTransform; - /** The mapping from wgs84 to grid */ - protected MathTransform wgsToGridTransform; - - /** The mapping from grid to wgs84 */ - protected MathTransform gridToWGSTransform; - /** The time in ms that the last blink state was used */ protected long timeLastBlink; @@ -229,9 +208,6 @@ public class MapDescriptor extends AbstractDescriptor implements */ protected int mapWidth; - /** The geospatial descriptor for the grid */ - protected GeneralGridGeometry gridGeometry; - /** elevation exaggeration */ protected double elevationExageration = 0; @@ -242,8 +218,6 @@ public class MapDescriptor extends AbstractDescriptor implements LAT_LON_FORMATTER.setMaximumFractionDigits(2); } - private String cloudSourceName; - /** * Constructor * @@ -274,49 +248,26 @@ public class MapDescriptor extends AbstractDescriptor implements * */ public MapDescriptor(GeneralGridGeometry gridGeometry) throws VizException { - super(); - - this.gridGeometry = gridGeometry; + super(gridGeometry); init(); } protected void init() throws VizException { - MathTransformFactory mtf = new DefaultMathTransformFactory(); - try { - - mapToCoordinateTransform = this.gridGeometry + GeneralGridGeometry gridGeometry = getGridGeometry(); + mapToCoordinateTransform = gridGeometry .getGridToCRS(PixelInCell.CELL_CENTER); coordinateToMapTransform = mapToCoordinateTransform.inverse(); - CoordinateReferenceSystem descriptorCRS = this.gridGeometry - .getCoordinateReferenceSystem(); - if (descriptorCRS.toWKT().equals( - DefaultGeocentricCRS.CARTESIAN.toWKT())) { - inverseCoordinateTransform = CRS.findMathTransform( - descriptorCRS, DefaultGeographicCRS.WGS84_3D); - coordinateTransform = inverseCoordinateTransform.inverse(); - - } else { - inverseCoordinateTransform = CRSCache.getInstance() - .getTransformToLatLon(descriptorCRS); - coordinateTransform = inverseCoordinateTransform.inverse(); - } - - wgsToGridTransform = mtf.createConcatenatedTransform( - coordinateTransform, coordinateToMapTransform); - gridToWGSTransform = mtf.createConcatenatedTransform( - mapToCoordinateTransform, inverseCoordinateTransform); - - CoordinateReferenceSystem crs = this.gridGeometry + CoordinateReferenceSystem crs = gridGeometry .getCoordinateReferenceSystem(); DirectPosition s1, d1, s2, d2; if (crs.getCoordinateSystem().getDimension() == 2) { - double centerX = (this.gridGeometry.getGridRange().getLow(0) + this.gridGeometry + double centerX = (gridGeometry.getGridRange().getLow(0) + gridGeometry .getGridRange().getHigh(0)) / 2; - double centerY = (this.gridGeometry.getGridRange().getLow(1) + this.gridGeometry + double centerY = (gridGeometry.getGridRange().getLow(1) + gridGeometry .getGridRange().getHigh(1)) / 2; s1 = new DirectPosition2D(centerX, centerY); @@ -367,43 +318,6 @@ public class MapDescriptor extends AbstractDescriptor implements } } - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.drawables.IDescriptor#pixelToWorld(double[]) - */ - @Override - public double[] pixelToWorld(final double[] pixel) { - // if (pixel[0] < 1.0) - // pixel[0] = 1; - // - // if (pixel[0] > theWorldWidth - 1.0) - // pixel[0] = theWorldWidth - 1.0; - // - // if (pixel[1] < 1.0) - // pixel[1] = 1; - // - // if (pixel[1] > theWorldHeight - 1.0) - // pixel[1] = theWorldHeight; - - double[] output = new double[3]; - double[] wpixel = pixel; - - if (pixel.length == 2) { - wpixel = new double[] { pixel[0], pixel[1], 0 }; - } - - try { - gridToWGSTransform.transform(wpixel, 0, output, 0, 1); - } catch (TransformException e) { - e.printStackTrace(); - return null; - } - - return output; - } - /* * (non-Javadoc) * @@ -417,7 +331,7 @@ public class MapDescriptor extends AbstractDescriptor implements if (crs == MapUtil.LATLON_PROJECTION) { return pixelToWorld(pixel); } else if (!crs.getName().equals( - this.gridGeometry.getCoordinateReferenceSystem().getName())) { + getGridGeometry().getCoordinateReferenceSystem().getName())) { return null; } @@ -431,33 +345,6 @@ public class MapDescriptor extends AbstractDescriptor implements return output2; } - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.drawables.IDescriptor#worldToPixel(double[]) - */ - @Override - public double[] worldToPixel(double[] world) { - - double[] output = new double[3]; - - double[] input = null; - if (world.length == 2) { - input = new double[] { world[0], world[1], 0 }; - } else { - input = world; - } - - try { - wgsToGridTransform.transform(input, 0, output, 0, 1); - } catch (TransformException e) { - return null; - } - - return output; - } - /* * (non-Javadoc) * @@ -466,11 +353,10 @@ public class MapDescriptor extends AbstractDescriptor implements */ @Override public double[] worldToPixel(double[] pixel, CoordinateReferenceSystem crs) { - if (crs == MapUtil.LATLON_PROJECTION) { return worldToPixel(pixel); } else if (!crs.getName().equals( - this.gridGeometry.getCoordinateReferenceSystem().getName())) { + getGridGeometry().getCoordinateReferenceSystem().getName())) { return null; } @@ -618,18 +504,6 @@ public class MapDescriptor extends AbstractDescriptor implements return pc; } - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.map.IMapDescriptor#getMapData() - */ - @Override - @XmlElement - @XmlJavaTypeAdapter(value = GridGeometryAdapter.class) - public GeneralGridGeometry getGridGeometry() { - return this.gridGeometry; - } - /* * (non-Javadoc) * @@ -656,29 +530,10 @@ public class MapDescriptor extends AbstractDescriptor implements @Override public void setGridGeometry(GeneralGridGeometry gridGeometry) throws VizException { - this.gridGeometry = gridGeometry; - + super.setGridGeometry(gridGeometry); init(); } - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.map.IMapDescriptor#getCRS() - */ - @Override - public CoordinateReferenceSystem getCRS() { - if (this.gridGeometry != null) { - return this.gridGeometry.getCoordinateReferenceSystem(); - } else { - return null; - } - } - - public MathTransform getToGridTransform() { - return this.wgsToGridTransform; - } - /** * Get the current display width * diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractPluginDataObjectResource.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractPluginDataObjectResource.java new file mode 100644 index 0000000000..6348c19966 --- /dev/null +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractPluginDataObjectResource.java @@ -0,0 +1,340 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.viz.core.rsc; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.opengis.referencing.crs.CoordinateReferenceSystem; + +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.VizApp; +import com.raytheon.uf.viz.core.drawables.IDescriptor; +import com.raytheon.uf.viz.core.drawables.IRenderable; +import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability; + +/** + * Abstract resource class that manages frames with renderable objects + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Dec 21, 2011            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public abstract class AbstractPluginDataObjectResource + extends AbstractVizResource { + + private static class Frame { + List records = new ArrayList(); + + IRenderable renderable; + } + + private Map frames = new HashMap(); + + private Object lock = new Object(); + + /** + * @param resourceData + * @param loadProperties + */ + protected AbstractPluginDataObjectResource(T resourceData, + LoadProperties loadProperties) { + super(resourceData, loadProperties); + dataTimes = new ArrayList(); + resourceData.addChangeListener(new IResourceDataChanged() { + @Override + public void resourceChanged(ChangeType type, Object object) { + if (type == ChangeType.DATA_UPDATE) { + if (object instanceof PluginDataObject) { + addDataObject((PluginDataObject) object); + } else if (object instanceof PluginDataObject[]) { + for (PluginDataObject pdo : (PluginDataObject[]) object) { + addDataObject((PluginDataObject) pdo); + } + } else if (object instanceof Object[]) { + for (Object obj : (Object[]) object) { + if (obj instanceof PluginDataObject) { + addDataObject((PluginDataObject) obj); + } + } + } + } else if (type == ChangeType.CAPABILITY) { + if (object instanceof AbstractCapability) { + AbstractCapability capability = (AbstractCapability) object; + for (Frame frame : frames.values()) { + if (frame.renderable != null) { + capabilityChanged(frame.renderable, capability); + } + } + } + } + } + }); + } + + /** + * Adds the pdo to the appropriate time and removes any renderable or data + * cached for that time. + * + * @param pdo + */ + protected final void addDataObject(PluginDataObject pdo) { + synchronized (lock) { + if (frames == null) { + // Check for null in case we were waiting for lock from + // disposeInternal in which case we shouldn't process add + return; + } + DataTime time = getDataObjectTime(pdo); + Frame frame = frames.get(time); + if (frame == null) { + frame = new Frame(); + frames.put(time, frame); + } + if (frame.records.contains(pdo)) { + frame.records.remove(pdo); + } + frame.records.add(pdo); + if (frame.renderable != null) { + if (updateRenderable(frame.renderable, pdo) == false) { + dispose(frame.renderable); + } + } + if (!dataTimes.contains(dataTimes)) { + dataTimes.add(time); + } + } + } + + /** + * Return the DataTime to be associated with this record. Default returns + * PluginDataObject.getDataTime() + * + * @param pdo + * @return + */ + protected DataTime getDataObjectTime(PluginDataObject pdo) { + return pdo.getDataTime(); + } + + /** + * Get the records for the given time. Empty list will be returned if no + * frame for time + * + * @param time + * @return + */ + protected List getPluginDataObjects(DataTime time) { + Frame frame = frames.get(time); + if (frame != null) { + return frame.records; + } + return new ArrayList(); + } + + /** + * Get the current time for the resource, default calls + * descriptor.getTimeForResoruce(this) + * + * @return the current time + */ + protected DataTime getTimeForResource() { + return descriptor.getTimeForResource(this); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.rsc.AbstractVizResource#remove(com.raytheon. + * uf.common.time.DataTime) + */ + @Override + public final void remove(DataTime dataTime) { + synchronized (lock) { + super.remove(dataTime); + Frame frame = frames.remove(dataTime); + if (frame != null && frame.renderable != null) { + IRenderable dispose = frame.renderable; + frame.renderable = null; + dispose(dispose); + } + } + } + + /** + * Dispose of a renderable. + * + * @param renderable + */ + private void dispose(final IRenderable renderable) { + VizApp.runAsync(new Runnable() { + @Override + public void run() { + disposeRenderable(renderable); + } + }); + } + + @Override + public final void project(CoordinateReferenceSystem crs) + throws VizException { + Iterator iter = frames.values().iterator(); + while (iter.hasNext()) { + Frame frame = iter.next(); + IRenderable renderable = frame.renderable; + if (renderable != null) { + if (!projectRenderable(renderable, crs)) { + frame.renderable = null; + dispose(renderable); + } + } + } + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.rsc.AbstractVizResource#paintInternal(com.raytheon + * .uf.viz.core.IGraphicsTarget, + * com.raytheon.uf.viz.core.drawables.PaintProperties) + */ + @Override + protected final void paintInternal(IGraphicsTarget target, + PaintProperties paintProps) throws VizException { + DataTime time = paintProps.getDataTime(); + if (time == null) { + time = getTimeForResource(); + } + Frame currFrame = frames.get(time); + if (currFrame != null) { + IRenderable renderable = currFrame.renderable; + if (renderable == null) { + currFrame.renderable = renderable = constructRenderable(currFrame.records); + } + + if (renderable != null) { + renderable.paint(target, paintProps); + } + } + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#disposeInternal() + */ + @Override + protected final void disposeInternal() { + synchronized (lock) { + for (Frame frame : frames.values()) { + if (frame.renderable != null) { + disposeRenderable(frame.renderable); + } + } + frames.clear(); + frames = null; + } + disposeResource(); + } + + /** + * Dispose method for the resource to dispose any data not tied to a + * renderable. Called after all renderables have been disposed. Default impl + * does nothing + */ + protected void disposeResource() { + + } + + /** + * Notification that a capability has changed and the renderable should be + * updated + * + * @param renderable + * @param capability + */ + protected abstract void capabilityChanged(IRenderable renderable, + AbstractCapability capability); + + /** + * Dispose the renderable object + * + * @param renderable + */ + protected abstract void disposeRenderable(IRenderable renderable); + + /** + * Attempt to reproject the renderable object into this specified + * projection. If unable to reproject, return false and renderable will be + * recreated next paint + * + * @param renderable + * @param crs + * @return + */ + protected abstract boolean projectRenderable(IRenderable renderable, + CoordinateReferenceSystem crs) throws VizException; + + /** + * Construct a renderable object for the given records. This method is + * called from paintInternal. Null can be returned and this method will be + * called next paintInternal. That can be used if requesting data that is + * required for the renderable asynchronously. + * + * NOTE: The size of the pdo list will only grow so it can be used to + * determine if new data has arrived since last call + * + * @param records + * @return + */ + protected abstract IRenderable constructRenderable( + List records) throws VizException; + + /** + * Update the renderable with the new pdo, if the renderable is updatable, + * return true. If the renderable needs to be recreated from scratch, return + * false + * + * @param renderable + * @param pdo + * @return + */ + protected abstract boolean updateRenderable(IRenderable renderable, + PluginDataObject pdo); +} diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractRequestableResourceData.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractRequestableResourceData.java index 717e5125fe..84c79a96cd 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractRequestableResourceData.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractRequestableResourceData.java @@ -21,6 +21,7 @@ package com.raytheon.uf.viz.core.rsc; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; @@ -385,11 +386,6 @@ public abstract class AbstractRequestableResourceData extends Set currentSet = new HashSet(Arrays.asList(current)); - boolean initialLoad = false; - if (currentSet.size() == 0) { - initialLoad = true; - } - Set loadSet = new HashSet(); for (DataTime t : desiredSet) { boolean found = false; @@ -409,6 +405,21 @@ public abstract class AbstractRequestableResourceData extends return new PluginDataObject[0]; } + return requestPluginDataObjects(loadSet); + } + + /** + * Request plugin data objects for the passed in times. This method is + * called from getLatestPluginDataObjects(DataTime[],DataTime[]) after time + * filter from desired and current has been done. The times passed in is a + * collection of new times needed + * + * @param loadSet + * @return + * @throws VizException + */ + protected PluginDataObject[] requestPluginDataObjects( + Collection loadSet) throws VizException { LayerProperty property = new LayerProperty(); // TODO fix? property.setDesiredProduct(ResourceType.PLAN_VIEW); @@ -476,7 +487,7 @@ public abstract class AbstractRequestableResourceData extends /** * Comparator for response array. */ - private static Comparator layerComparator = new Comparator() { + protected static Comparator layerComparator = new Comparator() { @Override public int compare(PluginDataObject arg0, PluginDataObject arg1) { diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractVizResource.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractVizResource.java index dfc7ff82e8..d4cbca28a6 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractVizResource.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/AbstractVizResource.java @@ -20,10 +20,10 @@ package com.raytheon.uf.viz.core.rsc; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; @@ -152,11 +152,11 @@ public abstract class AbstractVizResource(); - initListeners = new HashSet(); - paintListeners = new HashSet(); - paintStatusListeners = new HashSet(); - disposeListeners = new HashSet(); + refreshListeners = new CopyOnWriteArraySet(); + initListeners = new CopyOnWriteArraySet(); + paintListeners = new CopyOnWriteArraySet(); + paintStatusListeners = new CopyOnWriteArraySet(); + disposeListeners = new CopyOnWriteArraySet(); if (resourceData != null) { resourceData.addChangeListener(new IResourceDataChanged() { @@ -717,7 +717,7 @@ public abstract class AbstractVizResource + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * Mar 13, 2012 mschenke Initial creation + * + * + * + * @author mschenke + * @version 1.0 + */ public class ImageTile { - public com.vividsolutions.jts.geom.Envelope envelope; - - public double elevation; + public GridGeometry2D imageGeometry; public PixelCoverage coverage; - public Rectangle rect; + /** + * Checks to see if the x/y coordinate is contained by the ImageTile's CRS + * Envelope + * + * @param x + * @param y + * @return + */ + public boolean contains(double x, double y) { + Envelope env = imageGeometry.getEnvelope(); + return env.getMinimum(0) <= x && env.getMaximum(0) >= x + && env.getMinimum(1) <= y && env.getMaximum(1) >= y; + } - // TODO clean up occlusionQueries move to GLImage? - public int query = -1; + /** + * Checks to see if the Coordinate is contained by the ImageTile's CRS + * Envelope + * + * @param c + * @return + */ + public boolean contains(Coordinate c) { + return contains(c.x, c.y); + } - public boolean occlude = false; + /** + * Set the grid geometry of the tile given the image rectangle and the + * referenced envelope + * + * @param rect + * @param env + */ + public void setGridGeometry(Rectangle rect, ReferencedEnvelope env) { + GeneralGridEnvelope gge = new GeneralGridEnvelope(rect); + GeneralEnvelope ge = new GeneralEnvelope(env); + imageGeometry = new GridGeometry2D(gge, ge); + } + /** + * Set the image geometry + * + * @param imageGeometry + */ + public void setGridGeometry(GridGeometry2D imageGeometry) { + this.imageGeometry = imageGeometry; + } + + /** + * Get the image rectangle. This could be a subsection of a larger image so + * x and y may not be 0,0 + * + * @return + */ + public Rectangle getRectangle() { + GridEnvelope env = imageGeometry.getGridRange(); + return new Rectangle(env.getLow(0), env.getLow(1), env.getSpan(0), + env.getSpan(1)); + } + + /** + * Get the spatially referenced envelope of the image tile + * + * @return + */ + public ReferencedEnvelope getEnvelope() { + return new ReferencedEnvelope(imageGeometry.getEnvelope()); + } + + /** + * Dispose the image tile, disposes of the coverage object associated with + * it + */ public void dispose() { if (coverage != null) { coverage.dispose(); diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/hdf5/MeshCalculatorJob.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/hdf5/MeshCalculatorJob.java deleted file mode 100644 index d8932a7ca6..0000000000 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/hdf5/MeshCalculatorJob.java +++ /dev/null @@ -1,163 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ -package com.raytheon.uf.viz.core.rsc.hdf5; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.opengis.referencing.operation.MathTransform; - -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.uf.viz.core.IMesh; -import com.raytheon.uf.viz.core.IMeshCallback; -import com.raytheon.uf.viz.core.PixelCoverage; -import com.raytheon.uf.viz.core.rsc.RenderingOrderFactory; - -/** - * Persistent job used to calculate mesh tiles outside of the rendering thread - * - *
- * SOFTWARE HISTORY
- * Date         Ticket#     Engineer    Description
- * ------------ ----------  ----------- --------------------------
- * Mar 1, 2007              chammack    Initial Creation.
- * 
- * 
- * - * @author cnh - * @version 1 - */ -public class MeshCalculatorJob extends Job { - private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(MeshCalculatorJob.class); - - private static MeshCalculatorJob instance; - - private ConcurrentLinkedQueue requests; - - private ConcurrentHashMap map; - - private MeshCalculatorJob() { - super("Mesh Calculator"); - requests = new ConcurrentLinkedQueue(); - map = new ConcurrentHashMap(); - } - - /** - * Request to have the mesh be calculated in the mesh thread - * - * @param mesh - * @param tile - * @param preTransform - */ - public synchronized void requestLoad(IMesh mesh, ImageTile tile, - MathTransform preTransform) { - if (!requests.contains(tile.coverage)) { - MeshParameters params = new MeshParameters(); - params.tile = tile; - params.mesh = mesh; - params.preTransform = preTransform; - - map.put(tile.coverage, params); - requests.add(tile.coverage); - } - instance.schedule(); - } - - /** - * Request to have the mesh be calculated in the mesh thread, with the - * callback being notified after the mesh has been calculated - * - * @param callback - * @param mesh - * @param tile - * @param preTransform - */ - public synchronized void requestLoad(IMeshCallback callback, IMesh mesh, - ImageTile tile, MathTransform preTransform) { - if (!requests.contains(tile.coverage)) { - MeshParameters params = new MeshParameters(); - params.tile = tile; - params.mesh = mesh; - params.preTransform = preTransform; - params.callback = callback; - - map.put(tile.coverage, params); - requests.add(tile.coverage); - } - instance.schedule(); - } - - public static synchronized MeshCalculatorJob getInstance() { - if (instance == null) { - instance = new MeshCalculatorJob(); - instance.setSystem(true); - } - return instance; - } - - /* - * (non-Javadoc) - * - * @seeorg.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime. - * IProgressMonitor) - */ - @Override - protected IStatus run(IProgressMonitor monitor) { - - while (requests.size() > 0) { - PixelCoverage coverage = requests.peek(); - try { - MeshParameters p = map.get(coverage); - - coverage.setMesh(null); - p.mesh.calculateMesh(coverage, p.tile, p.preTransform); - coverage.setMesh(p.mesh); - - if (p.callback != null) { - p.callback.meshCalculated(p.tile); - } - } catch (Throwable t) { - statusHandler.handle(Priority.PROBLEM, "An error occured during mesh calculations, some images may not be properly reprojected.", t); - } - map.remove(coverage); - requests.remove(); - } - return Status.OK_STATUS; - } - - private class MeshParameters { - // public MapDescriptor mapDescriptor; - - public IMesh mesh; - - public ImageTile tile; - - public MathTransform preTransform; - - public IMeshCallback callback; - } - -} diff --git a/cave/com.raytheon.uf.viz.derivparam/META-INF/MANIFEST.MF b/cave/com.raytheon.uf.viz.derivparam/META-INF/MANIFEST.MF index ec54322b93..f3db5554a2 100644 --- a/cave/com.raytheon.uf.viz.derivparam/META-INF/MANIFEST.MF +++ b/cave/com.raytheon.uf.viz.derivparam/META-INF/MANIFEST.MF @@ -7,7 +7,10 @@ Bundle-Activator: com.raytheon.uf.viz.derivparam.Activator Bundle-Vendor: RAYTHEON Require-Bundle: org.eclipse.core.runtime, javax.measure, - com.raytheon.uf.common.dataquery + com.raytheon.uf.common.dataquery, + com.raytheon.uf.viz.core;bundle-version="1.12.1174", + com.raytheon.uf.common.datastorage;bundle-version="1.12.1174", + com.raytheon.uf.common.pointdata;bundle-version="1.12.1174" Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Eclipse-RegisterBuddy: com.raytheon.uf.common.serialization @@ -17,21 +20,13 @@ Import-Package: com.raytheon.edex.meteoLib, com.raytheon.uf.common.dataplugin, com.raytheon.uf.common.dataplugin.level, com.raytheon.uf.common.dataplugin.persist, - com.raytheon.uf.common.datastorage.records, com.raytheon.uf.common.derivparam.tree, com.raytheon.uf.common.localization, com.raytheon.uf.common.message.response, com.raytheon.uf.common.serialization, com.raytheon.uf.common.serialization.adapters, com.raytheon.uf.common.status, - com.raytheon.uf.common.time, - com.raytheon.uf.viz.core, - com.raytheon.uf.viz.core.catalog, - com.raytheon.uf.viz.core.comm, - com.raytheon.uf.viz.core.exception, - com.raytheon.uf.viz.core.level, - com.raytheon.uf.viz.core.localization, - com.raytheon.uf.viz.core.status + com.raytheon.uf.common.time Export-Package: com.raytheon.uf.viz.derivparam, com.raytheon.uf.viz.derivparam.data, com.raytheon.uf.viz.derivparam.inv, diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/data/AbstractDataCubeAdapter.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/data/AbstractDataCubeAdapter.java new file mode 100644 index 0000000000..2d61a7c8aa --- /dev/null +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/data/AbstractDataCubeAdapter.java @@ -0,0 +1,394 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.viz.derivparam.data; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; + +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataquery.requests.DbQueryRequest; +import com.raytheon.uf.common.dataquery.requests.DbQueryRequestSet; +import com.raytheon.uf.common.dataquery.requests.RequestConstraint; +import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType; +import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; +import com.raytheon.uf.common.dataquery.requests.TimeQueryRequestSet; +import com.raytheon.uf.common.dataquery.responses.DbQueryResponse; +import com.raytheon.uf.common.dataquery.responses.DbQueryResponseSet; +import com.raytheon.uf.common.datastorage.Request; +import com.raytheon.uf.common.datastorage.records.IDataRecord; +import com.raytheon.uf.common.pointdata.PointDataContainer; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.viz.core.catalog.LayerProperty; +import com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter; +import com.raytheon.uf.viz.core.datastructure.VizDataCubeException; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.requests.ThriftClient; +import com.raytheon.uf.viz.derivparam.tree.AbstractRequestableLevelNode; +import com.raytheon.uf.viz.derivparam.tree.AbstractRequestableLevelNode.Dependency; + +/** + * Abstract data cube adapter for standard data type that uses derived + * parameters + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Jan 30, 2012            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public abstract class AbstractDataCubeAdapter implements IDataCubeAdapter { + + private String[] supportedPlugins; + + protected AbstractDataCubeAdapter(String[] supportedPlugins) { + this.supportedPlugins = supportedPlugins; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getSupportedPlugins + * () + */ + @Override + public String[] getSupportedPlugins() { + return supportedPlugins; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#timeQuery(java + * .util.List) + */ + @Override + public List> timeQuery(List requests) + throws VizException { + int mapSize = (int) (requests.size() * 1) + 1; + Map> cache = new HashMap>( + mapSize); + LinkedHashMap queries = new LinkedHashMap( + mapSize); + + for (TimeQueryRequest request : requests) { + List requestNodes = evaluateRequestConstraints(request + .getQueryTerms()); + // pull out time queries and bulk submit + for (AbstractRequestableLevelNode requestNode : requestNodes) { + getTimeQuery(request, requestNode, false, queries, cache, null); + } + } + + // set the results back into the cache's + TimeQueryRequestSet reqSet = new TimeQueryRequestSet(); + reqSet.setRequests(queries.values().toArray( + new TimeQueryRequest[queries.size()])); + @SuppressWarnings("unchecked") + List> qResponses = (List>) ThriftClient + .sendRequest(reqSet); + int index = 0; + for (AbstractRequestableLevelNode node : queries.keySet()) { + // put results into cache + node.setTimeQueryResults(false, qResponses.get(index++), cache, + null); + } + List> finalResponse = new ArrayList>( + requests.size()); + for (TimeQueryRequest request : requests) { + List requestNodes = evaluateRequestConstraints(request + .getQueryTerms()); + // pull the actual results from the cache + Set results = new HashSet(64); + for (AbstractRequestableLevelNode requestNode : requestNodes) { + Set times = requestNode.timeQuery(request, false, + cache, null); + if (times == AbstractRequestableLevelNode.TIME_AGNOSTIC) { + // TODO: include time agnostic query in main bulk query as + // each pressure level will cause a separate query + List temp = timeAgnosticQuery(request + .getQueryTerms()); + if (temp != null) { + results.addAll(temp); + } + break; + } else { + results.addAll(times); + } + } + if (!request.isMaxQuery() || results.isEmpty()) { + finalResponse.add(new ArrayList(results)); + } else { + ArrayList response = new ArrayList(results); + Collections.sort(response); + finalResponse + .add(Arrays.asList(response.get(response.size() - 1))); + } + } + return finalResponse; + } + + protected void getTimeQuery( + TimeQueryRequest originalRequest, + AbstractRequestableLevelNode req, + boolean latestOnly, + LinkedHashMap queries, + Map> cache, + Map> latestOnlyCache) + throws VizException { + List depends = req.getDependencies(); + if (depends.isEmpty()) { + // is source node + TimeQueryRequest myQ = req.getTimeQuery(originalRequest, + latestOnly, cache, latestOnlyCache); + if (myQ != null) { + // no need to merge timeQueries + queries.put(req, myQ); + } + } else { + for (Dependency dep : depends) { + // TODO: Optimize dTime/fTime to use bulk query mechanism, + // small case that is a not easy to get right with a bulk + // query + if (dep.timeOffset == 0 || !latestOnly) { + getTimeQuery(originalRequest, dep.node, latestOnly, + queries, cache, latestOnlyCache); + } + } + } + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getPoints(java + * .lang.String, java.lang.String[], java.util.Map) + */ + @Override + public PointDataContainer getPoints(String plugin, String[] parameters, + Map queryParams) throws VizException { + // TODO Someday we should put objective analysis code + // into this area + return null; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getPoints(java + * .lang.String, java.lang.String[], java.lang.String, java.util.Map) + */ + @Override + public PointDataContainer getPoints(String plugin, String[] parameters, + String levelKey, Map queryParams) + throws VizException { + // TODO Someday we should put objective analysis code + // into this area + return null; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getData(com.raytheon + * .uf.viz.core.catalog.LayerProperty, int) + */ + @Override + public List getData(LayerProperty property, int timeOut) + throws VizException { + List requests = evaluateRequestConstraints(property + .getEntryQueryParameters(false)); + int mapSize = (int) (requests.size() * 1.25) + 1; + Map> cache = new HashMap>( + mapSize); + LinkedHashMap queries = new LinkedHashMap( + mapSize); + for (AbstractRequestableLevelNode req : requests) { + getDataQuery(req, property, timeOut, queries, cache); + } + DbQueryRequestSet reqSet = new DbQueryRequestSet(); + reqSet.setQueries(queries.values().toArray( + new DbQueryRequest[queries.size()])); + DbQueryResponseSet qSetResponse = (DbQueryResponseSet) ThriftClient + .sendRequest(reqSet); + DbQueryResponse[] qResponses = qSetResponse.getResults(); + int index = 0; + for (AbstractRequestableLevelNode node : queries.keySet()) { + // put results into cache + node.setDataQueryResults(qResponses[index++], cache); + } + + // pull the actual results from the cache + List requesters = new ArrayList( + requests.size()); + for (AbstractRequestableLevelNode request : requests) { + requesters.addAll(request.getData(property, timeOut, cache)); + } + + return getData(property, requesters); + } + + protected void getDataQuery( + AbstractRequestableLevelNode req, + LayerProperty property, + int timeOut, + LinkedHashMap queries, + Map> cache) + throws VizException { + List depends = req.getDependencies(); + if (depends.isEmpty()) { + // is source node + DbQueryRequest myQ = req.getDataQuery(property, timeOut, cache); + if (myQ != null) { + addDataQuery(req, myQ, queries); + } + } else { + for (Dependency dep : depends) { + // TODO: Optimize dTime/fTime to use bulk query mechanism, + // small case that is a not easy to get right with a bulk + // query + if (dep.timeOffset == 0) { + getDataQuery(dep.node, property, timeOut, queries, cache); + } + } + } + } + + private void addDataQuery(AbstractRequestableLevelNode req, + DbQueryRequest query, + LinkedHashMap queries) { + DbQueryRequest curQuery = queries.get(req); + if (curQuery == null) { + queries.put(req, query); + } else { + // merge + // assume same DB, fields, etc, should only be different + // time constraints since its the same node + RequestConstraint curDTs = curQuery.getConstraints() + .get("dataTime"); + RequestConstraint myDTs = query.getConstraints().get("dataTime"); + if (curDTs != null && myDTs != null) { + // only merge if both require dataTimes, otherwise one + // would be constrained when it needs everything, also + // assuming both to be in lists and needing to be merged + curDTs.setConstraintType(ConstraintType.IN); + Pattern split = Pattern.compile(","); + + String[] curVals = split.split(curDTs.getConstraintValue()); + String[] myVals = split.split(myDTs.getConstraintValue()); + HashSet dups = new HashSet(curVals.length + + myVals.length); + dups.addAll(Arrays.asList(curVals)); + dups.addAll(Arrays.asList(myVals)); + curDTs.setConstraintValueList(dups.toArray(new String[dups + .size()])); + } + } + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter# + * getBaseUpdateConstraints(java.util.Map) + */ + @Override + public List> getBaseUpdateConstraints( + Map constraints) { + List> result = new ArrayList>( + 1); + result.add(constraints); + return result; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getRecord(com + * .raytheon.uf.common.dataplugin.PluginDataObject) + */ + @Override + public IDataRecord[] getRecord(PluginDataObject obj) + throws VizDataCubeException { + return getRecord(obj, Request.ALL, null); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getRecord(com + * .raytheon.uf.common.dataplugin.PluginDataObject, + * com.raytheon.uf.common.datastorage.Request, java.lang.String) + */ + @Override + public IDataRecord[] getRecord(PluginDataObject obj, Request req, + String dataset) throws VizDataCubeException { + getRecords(Arrays.asList(obj), req, dataset); + IDataRecord[] result = (IDataRecord[]) obj.getMessageData(); + obj.setMessageData(null); + return result; + } + + /** + * Scan the inventory for AbstractRequestableLevelNodes that match the + * request constraints + * + * @param constraints + * @return + */ + protected abstract List evaluateRequestConstraints( + Map constraints); + + /** + * @param queryTerms + * @return + */ + protected abstract List timeAgnosticQuery( + Map queryTerms) throws VizException; + + /** + * @param requesters + * @return + */ + protected abstract List getData(LayerProperty property, + List requesters) throws VizException; +} diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/inv/AbstractInventory.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/inv/AbstractInventory.java index c472df5df2..fa5882292c 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/inv/AbstractInventory.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/inv/AbstractInventory.java @@ -581,7 +581,7 @@ public abstract class AbstractInventory implements DerivParamUpdateListener { || levelsToProcess == null || sourcesToProcess.isEmpty() || paramsToProcess.isEmpty() || levelsToProcess.isEmpty() || derParLibrary == null) { - return null; + return Collections.emptyList(); } if (clazz != null) { // when clazz == null we need to link the aliases to the source diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractAliasLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractAliasLevelNode.java index 299dc63a20..6ba0fd2526 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractAliasLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractAliasLevelNode.java @@ -26,6 +26,7 @@ import java.util.Set; import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; +import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.derivparam.library.DerivParamDesc; @@ -67,11 +68,13 @@ public abstract class AbstractAliasLevelNode extends AbstractDerivedLevelNode { } @Override - public Set timeQueryInternal(boolean latestOnly, + public Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { - return sourceNode.timeQuery(latestOnly, cache, latestOnlyCache); + return sourceNode.timeQuery(originalRequest, latestOnly, cache, + latestOnlyCache); } @Override diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractCubeLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractCubeLevelNode.java index 7273561c1f..fbe71d0063 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractCubeLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractCubeLevelNode.java @@ -31,6 +31,7 @@ import java.util.Set; import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; +import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.catalog.CatalogQuery; import com.raytheon.uf.viz.core.catalog.LayerProperty; @@ -270,7 +271,8 @@ public abstract class AbstractCubeLevelNode extends AbstractDerivedLevelNode { Map requestContraintsToFilter); @Override - public Set timeQueryInternal(boolean latestOnly, + public Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { @@ -299,8 +301,8 @@ public abstract class AbstractCubeLevelNode extends AbstractDerivedLevelNode { results.addAll(mergedTimeQuery(merge(requests), latestOnly)); for (AbstractRequestableLevelNode request : requests) { - results.addAll(request - .timeQuery(latestOnly, cache, latestOnlyCache)); + results.addAll(request.timeQuery(originalRequest, latestOnly, + cache, latestOnlyCache)); } return results; } diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractDerivedLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractDerivedLevelNode.java index 3c0899c34e..777a6d39a9 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractDerivedLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractDerivedLevelNode.java @@ -243,7 +243,8 @@ public abstract class AbstractDerivedLevelNode extends } @Override - protected TimeQueryRequest getTimeQueryInternal(boolean latestOnly, + protected TimeQueryRequest getTimeQueryInternal( + TimeQueryRequest originalRequest, boolean latestOnly, Map> cache) throws VizException { throw new UnsupportedOperationException( diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractRequestableLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractRequestableLevelNode.java index 050d89cda7..2a4d8040c9 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractRequestableLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/AbstractRequestableLevelNode.java @@ -205,7 +205,8 @@ public abstract class AbstractRequestableLevelNode extends LevelNode { protected abstract List processDataQueryResults( DbQueryResponse queryResponse) throws VizException; - public Set timeQuery(boolean latestOnly, + public Set timeQuery(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { @@ -215,15 +216,16 @@ public abstract class AbstractRequestableLevelNode extends LevelNode { return latestOnlyCache.get(this); } - Set results = timeQueryInternal(latestOnly, cache, - latestOnlyCache); + Set results = timeQueryInternal(originalRequest, latestOnly, + cache, latestOnlyCache); if (cache != null && !latestOnly) { cache.put(this, results); } return results; } - public TimeQueryRequest getTimeQuery(boolean latestOnly, + public TimeQueryRequest getTimeQuery(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { @@ -233,7 +235,7 @@ public abstract class AbstractRequestableLevelNode extends LevelNode { return null; } - return getTimeQueryInternal(latestOnly, cache); + return getTimeQueryInternal(originalRequest, latestOnly, cache); } public void setTimeQueryResults(boolean latestOnly, @@ -386,13 +388,14 @@ public abstract class AbstractRequestableLevelNode extends LevelNode { return rval; } - protected abstract Set timeQueryInternal(boolean latestOnly, + protected abstract Set timeQueryInternal( + TimeQueryRequest originalRequest, boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException; protected abstract TimeQueryRequest getTimeQueryInternal( - boolean latestOnly, + TimeQueryRequest originalRequest, boolean latestOnly, Map> cache) throws VizException; @@ -408,8 +411,9 @@ public abstract class AbstractRequestableLevelNode extends LevelNode { Map> cache) throws VizException; - protected Set timeQuery(boolean latestOnly) throws VizException { - return timeQuery(latestOnly, + protected Set timeQuery(TimeQueryRequest originalRequest, + boolean latestOnly) throws VizException { + return timeQuery(originalRequest, latestOnly, new HashMap>(), new HashMap>()); } diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/CompositeAverageLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/CompositeAverageLevelNode.java index 2fced96c35..abc78c6142 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/CompositeAverageLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/CompositeAverageLevelNode.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Set; import com.raytheon.uf.common.dataplugin.level.Level; +import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.catalog.LayerProperty; import com.raytheon.uf.viz.core.exception.VizException; @@ -102,7 +103,8 @@ public class CompositeAverageLevelNode extends UnionLevelNode { * boolean, java.util.Map) */ @Override - public Set timeQueryInternal(boolean latestOnly, + public Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { @@ -114,8 +116,8 @@ public class CompositeAverageLevelNode extends UnionLevelNode { for (AbstractRequestableLevelNode request : requests) { // Do not request just latest only because if two nodes have // different latests than this will return no times - Set times = request.timeQuery(false, cache, - latestOnlyCache); + Set times = request.timeQuery(originalRequest, false, + cache, latestOnlyCache); if (times == TIME_AGNOSTIC) { continue; } else if (results == TIME_AGNOSTIC) { diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/DerivedLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/DerivedLevelNode.java index 36871fe0d6..996cac67c1 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/DerivedLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/DerivedLevelNode.java @@ -32,6 +32,7 @@ import java.util.Map.Entry; import java.util.Set; import com.raytheon.uf.common.dataplugin.level.Level; +import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.common.time.DataTime.FLAG; import com.raytheon.uf.viz.core.catalog.LayerProperty; @@ -152,7 +153,8 @@ public class DerivedLevelNode extends AbstractDerivedLevelNode { } @Override - public Set timeQueryInternal(boolean latestOnly, + public Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { @@ -179,8 +181,8 @@ public class DerivedLevelNode extends AbstractDerivedLevelNode { } for (DerivParamField field : fieldsKeys) { AbstractRequestableLevelNode node = fields.get(field); - Set queryDataTimes = node.timeQuery(false, cache, - latestOnlyCache); + Set queryDataTimes = node.timeQuery(originalRequest, + false, cache, latestOnlyCache); timeCache.put(field, queryDataTimes); if (queryDataTimes == TIME_AGNOSTIC) { if (availableDataTimes == null) { @@ -288,7 +290,7 @@ public class DerivedLevelNode extends AbstractDerivedLevelNode { if (this.timeCache == null || this.lastTimeQuery + TIME_QUERY_CACHE_TIME < System .currentTimeMillis()) { - this.timeQuery(false); + this.timeQuery(null, false); } // keep a reference for scope of method diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/ModelRunLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/ModelRunLevelNode.java index e6ca35a9ca..bb847c456b 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/ModelRunLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/ModelRunLevelNode.java @@ -24,8 +24,8 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.common.time.DataTime; @@ -70,7 +70,7 @@ public class ModelRunLevelNode extends AbstractAliasLevelNode { int timeOut, Map> cache) throws VizException { - Set allTimes = this.timeQuery(false); + Set allTimes = this.timeQuery(null, false); Set neededTimes = null; DataTime[] requestedTimes = property.getSelectedEntryTime(); if (requestedTimes == null) { diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/OrLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/OrLevelNode.java index c021879be6..370c16b9a0 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/OrLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/OrLevelNode.java @@ -28,6 +28,7 @@ import java.util.Set; import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; +import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.catalog.LayerProperty; import com.raytheon.uf.viz.core.exception.VizException; @@ -116,7 +117,7 @@ public class OrLevelNode extends AbstractDerivedLevelNode { Set requestedTimes = null; DataTime[] requestedTimesArr = property.getSelectedEntryTime(); if (requestedTimesArr == null) { - requestedTimes = this.timeQuery(false); + requestedTimes = this.timeQuery(null, false); } else { requestedTimes = new HashSet( Arrays.asList(requestedTimesArr)); @@ -144,14 +145,15 @@ public class OrLevelNode extends AbstractDerivedLevelNode { } @Override - protected Set timeQueryInternal(boolean latestOnly, + protected Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { Set results = new HashSet(); for (AbstractRequestableLevelNode node : nodes) { - Set times = node.timeQuery(latestOnly, cache, - latestOnlyCache); + Set times = node.timeQuery(originalRequest, latestOnly, + cache, latestOnlyCache); if (times == AbstractRequestableLevelNode.TIME_AGNOSTIC) { return times; } else { diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/StaticDataLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/StaticDataLevelNode.java index 433117e4d1..8fd9ff5528 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/StaticDataLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/StaticDataLevelNode.java @@ -99,7 +99,8 @@ public class StaticDataLevelNode extends AbstractDerivedLevelNode { } @Override - public Set timeQueryInternal(boolean latestOnly, + public Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { @@ -107,7 +108,8 @@ public class StaticDataLevelNode extends AbstractDerivedLevelNode { } @Override - protected TimeQueryRequest getTimeQueryInternal(boolean latestOnly, + protected TimeQueryRequest getTimeQueryInternal( + TimeQueryRequest originalRequest, boolean latestOnly, Map> cache) throws VizException { return null; diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/TimeRangeLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/TimeRangeLevelNode.java index 336e32ecc8..466fd8bee5 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/TimeRangeLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/TimeRangeLevelNode.java @@ -28,6 +28,7 @@ import java.util.Map.Entry; import java.util.Set; import com.raytheon.uf.common.dataplugin.level.Level; +import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.catalog.LayerProperty; import com.raytheon.uf.viz.core.exception.VizException; @@ -82,7 +83,7 @@ public class TimeRangeLevelNode extends AbstractAliasLevelNode { int timeOut, Map> cache) throws VizException { - Set allTime = sourceNode.timeQuery(false); + Set allTime = sourceNode.timeQuery(null, false); Map> goodTimes = new HashMap>(); Set timesToRequest = new HashSet(); for (DataTime time : allTime) { @@ -126,12 +127,13 @@ public class TimeRangeLevelNode extends AbstractAliasLevelNode { } @Override - public Set timeQueryInternal(boolean latestOnly, + public Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { - Set allTime = sourceNode.timeQuery(false, cache, - latestOnlyCache); + Set allTime = sourceNode.timeQuery(originalRequest, false, + cache, latestOnlyCache); Set goodTimes = new HashSet(); for (DataTime time : allTime) { if (allTime.containsAll(calculateNeededTimes(time))) { diff --git a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/UnionLevelNode.java b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/UnionLevelNode.java index dc1bdbf4b9..4db0ae9216 100644 --- a/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/UnionLevelNode.java +++ b/cave/com.raytheon.uf.viz.derivparam/src/com/raytheon/uf/viz/derivparam/tree/UnionLevelNode.java @@ -30,6 +30,7 @@ import java.util.Map.Entry; import java.util.Set; import com.raytheon.uf.common.dataplugin.level.Level; +import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.catalog.LayerProperty; import com.raytheon.uf.viz.core.exception.VizException; @@ -142,7 +143,8 @@ public class UnionLevelNode extends AbstractDerivedLevelNode { } @Override - public Set timeQueryInternal(boolean latestOnly, + public Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { @@ -153,8 +155,8 @@ public class UnionLevelNode extends AbstractDerivedLevelNode { List requests = new ArrayList( nodes); for (AbstractRequestableLevelNode request : requests) { - Set times = request.timeQuery(latestOnly, cache, - latestOnlyCache); + Set times = request.timeQuery(originalRequest, + latestOnly, cache, latestOnlyCache); if (times == TIME_AGNOSTIC) { continue; } else if (results == TIME_AGNOSTIC) { diff --git a/cave/com.raytheon.uf.viz.npp.viirs/src/com/raytheon/uf/viz/npp/viirs/rsc/VIIRSResource.java b/cave/com.raytheon.uf.viz.npp.viirs/src/com/raytheon/uf/viz/npp/viirs/rsc/VIIRSResource.java index 3b836c1ab6..745f942f11 100644 --- a/cave/com.raytheon.uf.viz.npp.viirs/src/com/raytheon/uf/viz/npp/viirs/rsc/VIIRSResource.java +++ b/cave/com.raytheon.uf.viz.npp.viirs/src/com/raytheon/uf/viz/npp/viirs/rsc/VIIRSResource.java @@ -46,8 +46,6 @@ import com.raytheon.uf.viz.core.DrawableImage; import com.raytheon.uf.viz.core.HDF5Util; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.IGraphicsTarget.RasterMode; -import com.raytheon.uf.viz.core.IMesh; -import com.raytheon.uf.viz.core.PixelCoverage; import com.raytheon.uf.viz.core.drawables.ColorMapLoader; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.IImage; @@ -55,15 +53,12 @@ import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.drawables.ext.colormap.IColormappedImageExtension; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.IMapDescriptor; -import com.raytheon.uf.viz.core.map.IMapMeshExtension; import com.raytheon.uf.viz.core.rsc.AbstractVizResource; import com.raytheon.uf.viz.core.rsc.IResourceDataChanged; import com.raytheon.uf.viz.core.rsc.LoadProperties; import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.Envelope; /** * NPP VIIRS resource. Responsible for drawing a single color band @@ -194,8 +189,8 @@ public class VIIRSResource extends data.projectionData = new float[][] { lonFloats, latFloats }; data.tile = new ImageTile(); - data.tile.rect = new Rectangle(0, 0, width, height); - data.tile.envelope = new Envelope(0, width, 0, height); + // data.tile.rect = new Rectangle(0, 0, width, height); + // data.tile.envelope = new Envelope(0, width, 0, height); calculateMesh(data, target); @@ -384,20 +379,21 @@ public class VIIRSResource extends */ private void calculateMesh(VIIRSData frame, IGraphicsTarget target) throws VizException { - Rectangle tile = frame.tile.rect; - frame.tile.coverage = new PixelCoverage(new Coordinate(tile.getMinX(), - tile.getMinY()), - new Coordinate(tile.getMaxX(), tile.getMinY()), new Coordinate( - tile.getMaxX(), tile.getMaxY()), new Coordinate( - tile.getMinX(), tile.getMaxY())); - IMesh mesh = target.getExtension(IMapMeshExtension.class) - .constructMesh(descriptor); - mesh.calculateMesh(frame.tile.coverage, frame.tile, - new VIIRSDataMathTransform(frame.projectionData, - frame.tile.rect.width, frame.tile.rect.height)); - frame.projectionData = null; - frame.tile.coverage.setMesh(mesh); - frame.projectionData = null; + // Rectangle tile = frame.tile.rect; + // frame.tile.coverage = new PixelCoverage(new + // Coordinate(tile.getMinX(), + // tile.getMinY()), + // new Coordinate(tile.getMaxX(), tile.getMinY()), new Coordinate( + // tile.getMaxX(), tile.getMaxY()), new Coordinate( + // tile.getMinX(), tile.getMaxY())); + // IMesh mesh = target.getExtension(IMapMeshExtension.class) + // .constructMesh(descriptor); + // mesh.calculateMesh(frame.tile.coverage, frame.tile, + // new VIIRSDataMathTransform(frame.projectionData, + // frame.tile.rect.width, frame.tile.rect.height)); + // frame.projectionData = null; + // frame.tile.coverage.setMesh(mesh); + // frame.projectionData = null; } /** diff --git a/cave/com.raytheon.uf.viz.radar.gl/localization/glsl/mosaicMinDist.glsl b/cave/com.raytheon.uf.viz.radar.gl/localization/glsl/mosaicMinDist.glsl deleted file mode 100644 index 95a78bd7aa..0000000000 --- a/cave/com.raytheon.uf.viz.radar.gl/localization/glsl/mosaicMinDist.glsl +++ /dev/null @@ -1,16 +0,0 @@ -// this shader program sets values into a mosaic texture -// which is the same size as the screen (frame buffer) -// Use depth buffer texture - -uniform sampler2D radarData; -uniform sampler2D mosaicTexture; -uniform sampler2D depthTexture; -uniform int height; -uniform int width; - -void main(void) -{ - // TODO: Mimic mosaicMax except use depthTexture to look up current - // depth buffer info (which will actually store the current distance - -} \ No newline at end of file diff --git a/cave/com.raytheon.uf.viz.radar.gl/localization/glsl/mostRecentVal.glsl b/cave/com.raytheon.uf.viz.radar.gl/localization/glsl/mostRecentVal.glsl deleted file mode 100644 index 70a7843250..0000000000 --- a/cave/com.raytheon.uf.viz.radar.gl/localization/glsl/mostRecentVal.glsl +++ /dev/null @@ -1,10 +0,0 @@ -// this shader program sets values into a mosaic texture -// which is the same size as the screen (frame buffer) - -uniform sampler2D radarData; - -void main(void) -{ - vec4 radarVal = texture2D(radarData,gl_TexCoord[0].st); - gl_FragColor = vec4(radarVal.r,0.0,0.0,1.0); -} \ No newline at end of file diff --git a/cave/com.raytheon.uf.viz.radar.gl/plugin.xml b/cave/com.raytheon.uf.viz.radar.gl/plugin.xml index 703eeba965..aa3f2181c6 100644 --- a/cave/com.raytheon.uf.viz.radar.gl/plugin.xml +++ b/cave/com.raytheon.uf.viz.radar.gl/plugin.xml @@ -1,24 +1,13 @@ - - - - - - + class="com.raytheon.uf.viz.radar.gl.mosaic.GLRadarMosaicImageExtension"> diff --git a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/GLRadialMeshExtension.java b/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/GLRadialMeshExtension.java index b6e5df604a..252ad994ee 100644 --- a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/GLRadialMeshExtension.java +++ b/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/GLRadialMeshExtension.java @@ -59,7 +59,7 @@ public class GLRadialMeshExtension extends GraphicsExtension throws VizException { String format = radarData.getFormat(); if ("Radial".equals(format)) { - return RadarRadialMeshCache.getMesh(radarData, descriptor); + return RadarRadialMesh.getMesh(radarData, descriptor); } else { throw new VizException( "Cannot construct radial meshes for non radial RadarRecords"); @@ -74,6 +74,6 @@ public class GLRadialMeshExtension extends GraphicsExtension */ @Override public int getCompatibilityValue(IGLTarget target) { - return Compatibilty.TARGET_COMPATIBLE.value; + return Compatibilty.TARGET_COMPATIBLE; } } diff --git a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/MosaicGLTarget.java b/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/MosaicGLTarget.java deleted file mode 100644 index 246905cde0..0000000000 --- a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/MosaicGLTarget.java +++ /dev/null @@ -1,559 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ -package com.raytheon.uf.viz.radar.gl; - -import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; -import java.io.File; -import java.util.Collection; - -import org.eclipse.swt.graphics.RGB; -import org.geotools.coverage.grid.GeneralGridGeometry; - -import com.raytheon.uf.common.colormap.IColorMap; -import com.raytheon.uf.viz.core.DrawableCircle; -import com.raytheon.uf.viz.core.DrawableColorMap; -import com.raytheon.uf.viz.core.DrawableImage; -import com.raytheon.uf.viz.core.DrawableLine; -import com.raytheon.uf.viz.core.DrawableString; -import com.raytheon.uf.viz.core.IExtent; -import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelCoverage; -import com.raytheon.uf.viz.core.data.IDataPreparer; -import com.raytheon.uf.viz.core.data.IRenderedImageCallback; -import com.raytheon.uf.viz.core.drawables.ColorMapParameters; -import com.raytheon.uf.viz.core.drawables.IDescriptor; -import com.raytheon.uf.viz.core.drawables.IFont; -import com.raytheon.uf.viz.core.drawables.IFont.Style; -import com.raytheon.uf.viz.core.drawables.IImage; -import com.raytheon.uf.viz.core.drawables.IRenderableDisplay; -import com.raytheon.uf.viz.core.drawables.IShadedShape; -import com.raytheon.uf.viz.core.drawables.IWireframeShape; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.geom.PixelCoordinate; -import com.raytheon.viz.core.gl.IGLTarget; -import com.vividsolutions.jts.geom.LinearRing; - -/** - * IGraphicsTarget for mosaicing radar data, delegates all calls to an IGLTarget - * - *
- * 
- * SOFTWARE HISTORY
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Jun 22, 2010            mschenke     Initial creation
- * Jul 19, 2010 #5952      bkowal       Defined the 'updateExtent' method.
- * 
- * 
- * - * @author mschenke - * @version 1.0 - */ - -public class MosaicGLTarget implements IGraphicsTarget { - - private IGLTarget delegate; - - public MosaicGLTarget(IGLTarget delegateTarget) { - this.delegate = delegateTarget; - } - - /* Important functions!!! */ - public boolean drawRaster(IImage image, PixelCoverage extent, - PaintProperties paintProps, RasterMode mode) throws VizException { - return delegate.drawRaster(image, extent, paintProps, mode, - "mosaicMaxVal"); - } - - public boolean drawRaster(IImage image, PixelCoverage extent, - PaintProperties paintProps) throws VizException { - return delegate.drawRaster(image, extent, paintProps, "mosaicMaxVal"); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#drawRasters(com.raytheon.uf. - * viz.core.drawables.PaintProperties, - * com.raytheon.uf.viz.core.DrawableImage[]) - */ - @Override - public boolean drawRasters(PaintProperties paintProps, - DrawableImage... images) throws VizException { - return delegate.drawRasters("mosaicMaxVal", paintProps, images); - } - - /* Standard delegate functions */ - public void beginFrame(IRenderableDisplay display, boolean isClearBackground) { - delegate.beginFrame(display, isClearBackground); - } - - public IColorMap buildColorMap(String name) throws VizException { - return delegate.buildColorMap(name); - } - - public void clearClippingPlane() { - delegate.clearClippingPlane(); - } - - public IShadedShape createShadedShape(boolean mutable, - IDescriptor descriptor, boolean tesselate) { - return delegate.createShadedShape(mutable, descriptor, tesselate); - } - - public IWireframeShape createWireframeShape(boolean mutable, - GeneralGridGeometry geom, float simplificationLevel, - boolean spatialChopFlag, IExtent extent) { - return delegate.createWireframeShape(mutable, geom, - simplificationLevel, spatialChopFlag, extent); - } - - public IWireframeShape createWireframeShape(boolean mutableFlag, - GeneralGridGeometry geom) { - return delegate.createWireframeShape(mutableFlag, geom); - } - - public IWireframeShape createWireframeShape(boolean mutable, - IDescriptor descriptor, float simplificationLevel, - boolean spatialChopFlag, IExtent extent) { - return delegate.createWireframeShape(mutable, descriptor, - simplificationLevel, spatialChopFlag, extent); - } - - public IWireframeShape createWireframeShape(boolean mutable, - IDescriptor descriptor, float simplificationLevel) { - return delegate.createWireframeShape(mutable, descriptor, - simplificationLevel); - } - - public IWireframeShape createWireframeShape(boolean mutable, - IDescriptor descriptor) { - return delegate.createWireframeShape(mutable, descriptor); - } - - public void dispose() { - delegate.dispose(); - } - - public void drawArc(double x1, double y1, double z1, double radius, - RGB color, float width, int startAzimuth, int arcWidth, - LineStyle lineStyle, boolean includeSides) throws VizException { - delegate.drawArc(x1, y1, z1, radius, color, width, startAzimuth, - arcWidth, lineStyle, includeSides); - } - - public void drawCircle(double x1, double y1, double z1, double radius, - RGB color, float width) throws VizException { - delegate.drawCircle(x1, y1, z1, radius, color, width); - } - - public void drawColorRamp(IColorMap colorMap, IExtent pixelExtent, - float blendAlpha) throws VizException { - delegate.drawColorRamp(colorMap, pixelExtent, blendAlpha); - } - - public void drawCylinder(PixelCoordinate coord, RGB color, float alpha, - double height, double baseRadius, double topRadius, int sideCount, - int sliceCount, double rotation, double lean) { - delegate.drawCylinder(coord, color, alpha, height, baseRadius, - topRadius, sideCount, sliceCount, rotation, lean); - } - - public void drawFilledCircle(double x, double y, double z, double radius, - RGB color) throws VizException { - delegate.drawFilledCircle(x, y, z, radius, color); - } - - public void drawLine(double x1, double y1, double z1, double x2, double y2, - double z2, RGB color, float width, LineStyle lineStyle) - throws VizException { - delegate.drawLine(x1, y1, z1, x2, y2, z2, color, width, lineStyle); - } - - public void drawLine(double x1, double y1, double z1, double x2, double y2, - double z2, RGB color, float width) throws VizException { - delegate.drawLine(x1, y1, z1, x2, y2, z2, color, width); - } - - public void drawPoint(double x, double y, double z, RGB color, - PointStyle pointStyle) throws VizException { - delegate.drawPoint(x, y, z, color, pointStyle); - } - - public void drawRect(IExtent pe, RGB color, float lineWidth, double alpha) - throws VizException { - delegate.drawRect(pe, color, lineWidth, alpha); - } - - public void drawShadedPolygon(LinearRing poly, RGB color, double alpha, - byte[] pattern) throws VizException { - delegate.drawShadedPolygon(poly, color, alpha, pattern); - } - - public void drawShadedRect(IExtent pe, RGB color, double alpha, - byte[] pattern) throws VizException { - delegate.drawShadedRect(pe, color, alpha, pattern); - } - - public void drawShadedShape(IShadedShape shape, float alpha) - throws VizException { - delegate.drawShadedShape(shape, alpha); - } - - public void drawString(IFont font, String text, double x, double y, - double z, TextStyle textStyle, RGB color, - HorizontalAlignment horizontalAlignment, Double rotation) - throws VizException { - delegate.drawString(font, text, x, y, z, textStyle, color, - horizontalAlignment, rotation); - } - - public void drawString(IFont font, String text, double x, double y, - double z, TextStyle textStyle, RGB color, - HorizontalAlignment horizontalAlignment, - VerticalAlignment verticalAlignment, Double rotation) - throws VizException { - delegate.drawString(font, text, x, y, z, textStyle, color, - horizontalAlignment, verticalAlignment, rotation); - } - - public void drawStrings(IFont font, String[] text, double x, double y, - double z, TextStyle textStyle, RGB[] colors, - HorizontalAlignment horizontalAlignment, - VerticalAlignment verticalAlignment) throws VizException { - delegate.drawStrings(font, text, x, y, z, textStyle, colors, - horizontalAlignment, verticalAlignment); - } - - public void drawString(IFont font, String string, double xPos, double yPos, - double zPos, TextStyle textStyle, RGB color, - HorizontalAlignment horizontalAlignment, - VerticalAlignment verticalAlignment, Double rotation, float alpha, - double magnification) throws VizException { - // not implemented - } - - public void drawWireframeShape(IWireframeShape shape, RGB color, - float lineWidth, LineStyle lineStyle, IFont font) - throws VizException { - delegate.drawWireframeShape(shape, color, lineWidth, lineStyle, font); - } - - public void drawWireframeShape(IWireframeShape shape, RGB color, - float lineWidth, LineStyle lineStyle, IFont font, float alpha) - throws VizException { - delegate.drawWireframeShape(shape, color, lineWidth, lineStyle, font, - alpha); - } - - public void drawWireframeShape(IWireframeShape shape, RGB color, - float lineWidth, LineStyle lineStyle) throws VizException { - delegate.drawWireframeShape(shape, color, lineWidth, lineStyle); - } - - public void drawWireframeShape(IWireframeShape shape, RGB color, - float lineWidth, LineStyle lineStyle, float alpha) - throws VizException { - delegate.drawWireframeShape(shape, color, lineWidth, lineStyle, alpha); - } - - public void drawWireframeShape(IWireframeShape shape, RGB color, - float lineWidth) throws VizException { - delegate.drawWireframeShape(shape, color, lineWidth); - } - - public void endFrame() { - delegate.endFrame(); - } - - public IFont getDefaultFont() { - return delegate.getDefaultFont(); - } - - public double[] getPointOnCircle(double x1, double y1, double z1, - double radius, double angle) throws VizException { - return delegate.getPointOnCircle(x1, y1, z1, radius, angle); - } - - public Rectangle2D getStringBounds(IFont font, String text) { - return delegate.getStringBounds(font, text); - } - - public String getViewType() { - return delegate.getViewType(); - } - - public void init() { - delegate.init(); - } - - public IFont initializeFont(File fontFile, float size, Style[] styles) { - return delegate.initializeFont(fontFile, size, styles); - } - - public IFont initializeFont(String fontName, float size, Style[] styles) { - return delegate.initializeFont(fontName, size, styles); - } - - public IFont initializeFont(String font) { - return delegate.initializeFont(font); - } - - @Deprecated - public IImage initializeRaster(IDataPreparer preparer, - ColorMapParameters optionalParams) { - return delegate.initializeRaster(preparer, optionalParams); - } - - public IImage initializeRaster(IRenderedImageCallback imageCallback) { - return delegate.initializeRaster(imageCallback); - } - - public boolean isNeedsRefresh() { - return delegate.isNeedsRefresh(); - } - - public void resize() { - delegate.resize(); - } - - public BufferedImage screenshot() { - return delegate.screenshot(); - } - - public void setBackgroundColor(RGB backgroundColor) { - delegate.setBackgroundColor(backgroundColor); - } - - public void setNeedsRefresh(boolean needsRefresh) { - delegate.setNeedsRefresh(needsRefresh); - } - - public void setupClippingPlane(IExtent extent) { - delegate.setupClippingPlane(extent); - } - - public void setUseBuiltinColorbar(boolean isColorbarDisplayed) { - delegate.setUseBuiltinColorbar(isColorbarDisplayed); - } - - public void stage(IImage image) throws VizException { - delegate.stage(image); - } - - public void updateExtent(IExtent updatedExtent) { - /* Do Nothing */ - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#getStringBounds(com.raytheon - * .uf.viz.core.drawables.IFont, java.lang.String[], - * com.raytheon.uf.viz.core.IGraphicsTarget.TextStyle) - */ - @Override - public Rectangle2D getStringBounds(IFont font, String[] text, - TextStyle style) { - return delegate.getStringBounds(font, text, style); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#drawColorRamp(com.raytheon.uf - * .common.colormap.IColorMap, com.raytheon.uf.viz.core.IExtent, float, - * float, float) - */ - @Override - public void drawColorRamp(IColorMap colorMap, IExtent pixelExtent, - float blendAlpha, float brightness, float contrast) - throws VizException { - delegate.drawColorRamp(colorMap, pixelExtent, blendAlpha, brightness, - contrast); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#drawShadedShape(com.raytheon - * .uf.viz.core.drawables.IShadedShape, float, float) - */ - @Override - public void drawShadedShape(IShadedShape shape, float alpha, - float brightness) throws VizException { - delegate.drawShadedShape(shape, alpha, brightness); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#drawColorRamp(com.raytheon.uf - * .viz.core.drawables.ColorMapParameters, com.raytheon.uf.viz.core.IExtent, - * float) - */ - @Override - public void drawColorRamp(ColorMapParameters colorMapParams, - IExtent pixelExtent, float blendAlpha) throws VizException { - - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#drawColorRamp(com.raytheon.uf - * .viz.core.drawables.ColorMapParameters, com.raytheon.uf.viz.core.IExtent, - * float, float, float) - */ - @Override - public void drawColorRamp(ColorMapParameters colorMapParams, - IExtent pixelExtent, float blendAlpha, float brightness, - float contrast) throws VizException { - - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.IGraphicsTarget#drawPoint(double, double, - * double, org.eclipse.swt.graphics.RGB, - * com.raytheon.uf.viz.core.IGraphicsTarget.PointStyle, float) - */ - @Override - public void drawPoint(double x, double y, double z, RGB color, - PointStyle pointStyle, float magnification) throws VizException { - - } - - @Override - public void renderOffscreen(IImage offscreenImage) throws VizException { - delegate.renderOffscreen(offscreenImage); - - } - - @Override - public void renderOnscreen() throws VizException { - delegate.renderOnscreen(); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#getStringsBounds(com.raytheon - * .uf.viz.core.DrawStringsParameters) - */ - @Override - public Rectangle2D getStringsBounds(DrawableString parameters) { - return null; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#getStringsBounds(com.raytheon - * .uf.viz.core.DrawStringsParameters, java.lang.String) - */ - @Override - public Rectangle2D getStringsBounds(DrawableString parameters, String string) { - return null; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#drawStrings(com.raytheon.uf. - * viz.core.DrawStringsParameters) - */ - @Override - public void drawStrings(DrawableString... parameters) throws VizException { - - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#drawColorRamp(com.raytheon.uf - * .viz.core.DrawableColorMap) - */ - @Override - public void drawColorRamp(DrawableColorMap colorMap) throws VizException { - - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#drawCircle(com.raytheon.uf.viz - * .core.DrawableCircle) - */ - @Override - public void drawCircle(DrawableCircle... circle) throws VizException { - - } - - @Override - public void drawStrings(Collection parameters) - throws VizException { - - } - - @Override - public void drawPoints(Collection locations, RGB color, - PointStyle pointStyle, float magnification) throws VizException { - - } - - @Override - public void drawShadedShapes(float alpha, float brightness, - IShadedShape... shapes) throws VizException { - delegate.drawShadedShapes(alpha, brightness, shapes); - } - - @Override - public T getExtension(Class extensionClass) throws VizException { - return delegate.getExtension(extensionClass); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#drawLine(com.raytheon.uf.viz - * .core.DrawableLine[]) - */ - @Override - public void drawLine(DrawableLine... lines) throws VizException { - delegate.drawLine(lines); - } - -} diff --git a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/RadarRadialMesh.java b/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/RadarRadialMesh.java index 642d049b73..816826508c 100644 --- a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/RadarRadialMesh.java +++ b/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/RadarRadialMesh.java @@ -19,20 +19,25 @@ **/ package com.raytheon.uf.viz.radar.gl; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + import javax.media.opengl.GL; +import org.geotools.coverage.grid.GeneralGridGeometry; +import org.geotools.coverage.grid.GridGeometry2D; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.TransformException; import com.raytheon.uf.common.dataplugin.radar.RadarRecord; +import com.raytheon.uf.common.dataplugin.radar.util.RadarUtil; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.uf.viz.core.map.IMapDescriptor; -import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; +import com.raytheon.uf.viz.core.drawables.IDescriptor; +import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.core.gl.AbstractGLMesh; -import com.raytheon.viz.core.gl.GLGeometryObject2D; -import com.raytheon.viz.core.gl.GLGeometryObject2D.GLGeometryObjectData; import com.raytheon.viz.core.gl.SharedCoordMap.SharedCoordinateKey; /** @@ -55,30 +60,133 @@ public class RadarRadialMesh extends AbstractGLMesh { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(RadarRadialMesh.class); + private static class CacheKey { + private final float latitude; + + private final float longitude; + + private final int hashCode; + + private final int numBins; + + private final int numRadials; + + private final int gateResolution; + + private final float trueElevationAngle; + + private final int jStart; + + private final float[] angleData; + + private final GeneralGridGeometry gridGeometry; + + public CacheKey(float latitude, float longitude, int numBins, + int numRadials, int gateResolution, float trueElevationAngle, + int jStart, float[] angleData, GeneralGridGeometry gridGeometry) { + this.latitude = latitude; + this.longitude = longitude; + this.numBins = numBins; + this.numRadials = numRadials; + this.gateResolution = gateResolution; + this.trueElevationAngle = trueElevationAngle; + this.jStart = jStart; + this.angleData = angleData; + this.gridGeometry = gridGeometry; + final int prime = 31; + int hashCode = 1; + hashCode = prime * hashCode + Arrays.hashCode(angleData); + hashCode = prime * hashCode + gateResolution; + hashCode = prime * hashCode + jStart; + hashCode = prime * hashCode + Float.floatToIntBits(latitude); + hashCode = prime * hashCode + Float.floatToIntBits(longitude); + hashCode = prime * hashCode + numBins; + hashCode = prime * hashCode + numRadials; + hashCode = prime * hashCode + + Float.floatToIntBits(trueElevationAngle); + hashCode = prime * hashCode + gridGeometry.hashCode(); + this.hashCode = hashCode; + } + + @Override + public int hashCode() { + return hashCode; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + CacheKey other = (CacheKey) obj; + if (hashCode != other.hashCode) + return false; + if (gateResolution != other.gateResolution) + return false; + if (jStart != other.jStart) + return false; + if (latitude != other.latitude) + return false; + if (longitude != other.longitude) + return false; + if (numBins != other.numBins) + return false; + if (numRadials != other.numRadials) + return false; + if (Float.floatToIntBits(trueElevationAngle) != Float + .floatToIntBits(other.trueElevationAngle)) + return false; + if (!Arrays.equals(angleData, other.angleData)) + return false; + if (gridGeometry != null && other.gridGeometry == null) { + return false; + } + if (gridGeometry == null && other.gridGeometry != null) { + return false; + } + if (gridGeometry != null + && !gridGeometry.equals(other.gridGeometry)) { + return false; + } + return true; + } + } + + private static Map cache = new HashMap(); + /** The record to build the mesh for */ private RadarRecord record; - private IMapDescriptor descriptor; + private CacheKey cacheKey; - public RadarRadialMesh(IMapDescriptor descriptor, RadarRecord record) { - super(GL.GL_TRIANGLE_STRIP, descriptor); + private int refCount; + + public RadarRadialMesh(RadarRecord record, + GeneralGridGeometry targetGeometry, CacheKey cacheKey) + throws VizException { + super(GL.GL_TRIANGLE_STRIP); this.record = record; - this.descriptor = descriptor; + this.cacheKey = cacheKey; + initialize( + RadarUtil.constructGridGeometry(record.getCRS(), + RadarUtil.calculateExtent(record), + Math.max(record.getNumBins(), record.getNumRadials())), + targetGeometry); + refCount = 0; } @Override - protected double[][][] generateWorldCoords(ImageTile tile, MathTransform mt) - throws TransformException { + protected double[][][] generateWorldCoords(GridGeometry2D imageGeometry, + MathTransform mt) throws TransformException { int horizontalDivisions = key.horizontalDivisions; - int verticalDivisions = key.verticalDivisions; + int verticalDivisions = key.verticalDivisions + 1; // get dx and dy for texture points - float dX = (1.0f / (horizontalDivisions)); - - vertexCoords = new GLGeometryObject2D(new GLGeometryObjectData( - GL.GL_TRIANGLE_STRIP, GL.GL_VERTEX_ARRAY)); - vertexCoords.allocate(2 * verticalDivisions * horizontalDivisions); + float dX = (1.0f / (key.horizontalDivisions)); // set up our angle data for the radials float[] angles = record.getAngleData(); @@ -166,9 +274,10 @@ public class RadarRadialMesh extends AbstractGLMesh { } @Override - protected SharedCoordinateKey generateKey(ImageTile tile, MathTransform mt) { + protected SharedCoordinateKey generateKey(GridGeometry2D imageGeometry, + MathTransform mt) { try { - return new SharedCoordinateKey(record.getNumRadials() + 1, + return new SharedCoordinateKey(record.getNumRadials(), getNumVerticalDivisions(mt, record)); } catch (Exception e) { statusHandler @@ -202,7 +311,7 @@ public class RadarRadialMesh extends AbstractGLMesh { in[1] = 0; toLatLon.transform(in, 0, out, 0, 1); - double[] start = descriptor.worldToPixel(out); + double[] start = worldToPixel(out); for (int i = 0; i < angles.length; ++i) { // grab end @@ -215,7 +324,7 @@ public class RadarRadialMesh extends AbstractGLMesh { in[0] = range * sinAz; in[1] = range * cosAz; toLatLon.transform(in, 0, out, 0, 1); - out = descriptor.worldToPixel(out); + out = worldToPixel(out); int[] curPow2 = new int[] { (int) Math.floor(Math.log(numBins) / Math.log(2)) }; @@ -256,7 +365,7 @@ public class RadarRadialMesh extends AbstractGLMesh { double[] in = new double[] { rangeToTry * sinAz, rangeToTry * cosAz }; double[] actual = new double[3]; toLatLon.transform(in, 0, actual, 0, 1); - actual = descriptor.worldToPixel(actual); + actual = worldToPixel(actual); // Get linear interpolated point double[] interp = new double[] { (endLoc[0] + startLoc[0]) / 2, @@ -276,4 +385,54 @@ public class RadarRadialMesh extends AbstractGLMesh { } } + private void use() { + refCount += 1; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.AbstractGLMesh#dispose() + */ + @Override + public synchronized void dispose() { + refCount -= 1; + synchronized (cache) { + if (refCount == 0) { + super.dispose(); + cache.remove(cacheKey); + } + } + } + + public static RadarRadialMesh getMesh(RadarRecord radarData, + IDescriptor descriptor) throws VizException { + float latitude = radarData.getLatitude(); + float longitude = radarData.getLongitude(); + int numBins = radarData.getNumBins(); + int numRadials = radarData.getNumRadials(); + int gateResolution = radarData.getGateResolution(); + float trueElevationAngle = radarData.getTrueElevationAngle(); + Integer jStart = radarData.getJstart(); + if (jStart == null) { + jStart = 0; + } + float[] angleData = radarData.getAngleData(); + CacheKey key = new CacheKey(latitude, longitude, numBins, numRadials, + gateResolution, trueElevationAngle, jStart, angleData, + descriptor.getGridGeometry()); + synchronized (cache) { + RadarRadialMesh mesh = cache.get(key); + if (mesh == null) { + // System.out.println("Mesh Cache miss"); + mesh = new RadarRadialMesh(radarData, + descriptor.getGridGeometry(), key); + cache.put(key, mesh); + } else { + // System.out.println("Mesh Cache hit"); + } + mesh.use(); + return mesh; + } + } } diff --git a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/RadarRadialMeshCache.java b/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/RadarRadialMeshCache.java deleted file mode 100644 index 08320d3a21..0000000000 --- a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/RadarRadialMeshCache.java +++ /dev/null @@ -1,252 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ -package com.raytheon.uf.viz.radar.gl; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import org.geotools.coverage.grid.GeneralGridGeometry; -import org.geotools.coverage.grid.GridGeometry2D; -import org.opengis.referencing.operation.MathTransform; - -import com.raytheon.uf.common.dataplugin.radar.RadarRecord; -import com.raytheon.uf.viz.core.IExtent; -import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.IMesh; -import com.raytheon.uf.viz.core.PixelCoverage; -import com.raytheon.uf.viz.core.drawables.IDescriptor; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.map.IMapDescriptor; -import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; - -/** - * - * TODO Add Description - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Jul 28, 2011            bsteffen     Initial creation
- * 
- * 
- * - * @author bsteffen - * @version 1.0 - */ -public class RadarRadialMeshCache { - - private static class CacheKey { - - private final float latitude; - - private final float longitude; - - private final int hashCode; - - private final int numBins; - - private final int numRadials; - - private final int gateResolution; - - private final float trueElevationAngle; - - private final int jStart; - - private final float[] angleData; - - private final GeneralGridGeometry gridGeometry; - - public CacheKey(float latitude, float longitude, int numBins, - int numRadials, int gateResolution, float trueElevationAngle, - int jStart, float[] angleData, GeneralGridGeometry gridGeometry) { - this.latitude = latitude; - this.longitude = longitude; - this.numBins = numBins; - this.numRadials = numRadials; - this.gateResolution = gateResolution; - this.trueElevationAngle = trueElevationAngle; - this.jStart = jStart; - this.angleData = angleData; - this.gridGeometry = gridGeometry; - final int prime = 31; - int hashCode = 1; - hashCode = prime * hashCode + Arrays.hashCode(angleData); - hashCode = prime * hashCode + gateResolution; - hashCode = prime * hashCode + jStart; - hashCode = prime * hashCode + Float.floatToIntBits(latitude); - hashCode = prime * hashCode + Float.floatToIntBits(longitude); - hashCode = prime * hashCode + numBins; - hashCode = prime * hashCode + numRadials; - hashCode = prime * hashCode - + Float.floatToIntBits(trueElevationAngle); - hashCode = prime * hashCode + gridGeometry.hashCode(); - this.hashCode = hashCode; - } - - @Override - public int hashCode() { - return hashCode; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - CacheKey other = (CacheKey) obj; - if (hashCode != other.hashCode) - return false; - if (gateResolution != other.gateResolution) - return false; - if (jStart != other.jStart) - return false; - if (latitude != other.latitude) - return false; - if (longitude != other.longitude) - return false; - if (numBins != other.numBins) - return false; - if (numRadials != other.numRadials) - return false; - if (Float.floatToIntBits(trueElevationAngle) != Float - .floatToIntBits(other.trueElevationAngle)) - return false; - if (!Arrays.equals(angleData, other.angleData)) - return false; - if (gridGeometry != null && other.gridGeometry == null) { - return false; - } - if (gridGeometry == null && other.gridGeometry != null) { - return false; - } - if (gridGeometry != null - && !gridGeometry.equals(other.gridGeometry)) { - return false; - } - return true; - } - } - - public static class RadarSharedMesh implements IMesh { - - private final CacheKey key; - - private final IMesh mesh; - - private int refCount = 0; - - private boolean calculated = false; - - private RadarSharedMesh(IMesh mesh, CacheKey key) { - this.mesh = mesh; - this.key = key; - } - - @Override - public void paint(IGraphicsTarget target, PaintProperties paintProps) - throws VizException { - mesh.paint(target, paintProps); - } - - @Override - public synchronized void calculateMesh(PixelCoverage pc, - ImageTile tile, MathTransform toLatLon) { - if (!calculated) { - mesh.calculateMesh(pc, tile, toLatLon); - calculated = true; - } - - } - - @Override - public synchronized void calculateMesh(PixelCoverage pc, - GridGeometry2D gg) { - if (!calculated) { - mesh.calculateMesh(pc, gg); - calculated = true; - } - - } - - @Override - public void dispose() { - refCount -= 1; - synchronized (cache) { - if (refCount == 0) { - mesh.dispose(); - cache.remove(key); - } - } - } - - private void use() { - refCount += 1; - } - - @Override - public boolean intersects(IExtent extent) { - return mesh.intersects(extent); - } - } - - private static Map cache = new HashMap(); - - public static RadarSharedMesh getMesh(RadarRecord radarData, - IDescriptor descriptor) throws VizException { - float latitude = radarData.getLatitude(); - float longitude = radarData.getLongitude(); - int numBins = radarData.getNumBins(); - int numRadials = radarData.getNumRadials(); - int gateResolution = radarData.getGateResolution(); - float trueElevationAngle = radarData.getTrueElevationAngle(); - Integer jStart = radarData.getJstart(); - if (jStart == null) { - jStart = 0; - } - float[] angleData = radarData.getAngleData(); - CacheKey key = new CacheKey(latitude, longitude, numBins, numRadials, - gateResolution, trueElevationAngle, jStart, angleData, - descriptor.getGridGeometry()); - synchronized (cache) { - RadarSharedMesh mesh = cache.get(key); - if (mesh == null) { - // System.out.println("Mesh Cache miss"); - IMesh baseMesh = new RadarRadialMesh( - (IMapDescriptor) descriptor, radarData); - mesh = new RadarSharedMesh(baseMesh, key); - cache.put(key, mesh); - } else { - // System.out.println("Mesh Cache hit"); - } - mesh.use(); - return mesh; - } - } - -} diff --git a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/GLMosaicImage.java b/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/GLMosaicImage.java new file mode 100644 index 0000000000..de4808393f --- /dev/null +++ b/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/GLMosaicImage.java @@ -0,0 +1,107 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.viz.radar.gl.mosaic; + +import com.raytheon.uf.viz.core.DrawableImage; +import com.raytheon.viz.core.gl.images.AbstractGLImage; +import com.raytheon.viz.core.gl.images.GLDelegateImage; +import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicImageExtension.IMosaicImage; + +/** + * GL implementation of IMosaicImage, wraps an offscreen image and contains + * other DrawableImages to mosaic + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Dec 16, 2011            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class GLMosaicImage extends GLDelegateImage implements + IMosaicImage { + + private DrawableImage[] images; + + private boolean repaint; + + private int[] bounds; + + /** + * @param target + * @param image + * @param extensionClass + */ + public GLMosaicImage(AbstractGLImage image, int[] bounds) { + super(image, GLRadarMosaicImageExtension.class); + this.bounds = bounds; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.GLDelegateImage#getWidth() + */ + @Override + public int getWidth() { + return bounds[0]; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.GLDelegateImage#getHeight() + */ + @Override + public int getHeight() { + return bounds[1]; + } + + /** + * @return the repaint + */ + public boolean isRepaint() { + return repaint; + } + + /** + * @param repaint + * @return + */ + public void setRepaint(boolean repaint) { + this.repaint = repaint; + } + + public DrawableImage[] getImagesToMosaic() { + return images; + } + + public void setImagesToMosaic(DrawableImage... images) { + this.images = images; + repaint = true; + } +} diff --git a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/GLRadarMosaicImageExtension.java b/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/GLRadarMosaicImageExtension.java new file mode 100644 index 0000000000..30a0fce788 --- /dev/null +++ b/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/GLRadarMosaicImageExtension.java @@ -0,0 +1,164 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.viz.radar.gl.mosaic; + +import java.nio.ByteBuffer; + +import javax.media.opengl.GL; + +import com.raytheon.uf.viz.core.DrawableImage; +import com.raytheon.uf.viz.core.PixelCoverage; +import com.raytheon.uf.viz.core.drawables.ColorMapParameters; +import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.drawables.ImagingSupport; +import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.ext.IOffscreenRenderingExtension; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.viz.core.gl.ext.GLOffscreenRenderingExtension; +import com.raytheon.viz.core.gl.glsl.AbstractGLSLImagingExtension; +import com.raytheon.viz.core.gl.glsl.GLShaderProgram; +import com.raytheon.viz.core.gl.images.AbstractGLImage; +import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicImageExtension; + +/** + * Extension used for rendering radar mosaic images + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Dec 16, 2011            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class GLRadarMosaicImageExtension extends AbstractGLSLImagingExtension + implements IRadarMosaicImageExtension { + + private AbstractGLImage writeToImage; + + public GLMosaicImage initializeRaster(int[] imageBounds, + ColorMapParameters params) throws VizException { + return new GLMosaicImage(target.getExtension( + GLOffscreenRenderingExtension.class).constructOffscreenImage( + ByteBuffer.class, imageBounds, params), imageBounds); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#getShaderProgramName + * () + */ + @Override + public String getShaderProgramName() { + return "mosaicMaxVal"; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#preImageRender + * (com.raytheon.uf.viz.core.drawables.PaintProperties, + * com.raytheon.viz.core.gl.images.AbstractGLImage) + */ + @Override + public synchronized Object preImageRender(PaintProperties paintProps, + AbstractGLImage image, PixelCoverage coverage) throws VizException { + if (image instanceof GLMosaicImage) { + GLMosaicImage mosaicImage = (GLMosaicImage) image; + if (mosaicImage.isRepaint()) { + writeToImage = mosaicImage.getWrappedImage(); + IOffscreenRenderingExtension extension = target + .getExtension(IOffscreenRenderingExtension.class); + try { + extension.renderOffscreen(mosaicImage); + DrawableImage[] imagesToMosaic = mosaicImage + .getImagesToMosaic(); + // Make sure images are staged before we mosaic them + ImagingSupport.prepareImages(target, imagesToMosaic); + // Need to set repaint based on if drawing completed + mosaicImage.setRepaint(drawRasters(paintProps, + imagesToMosaic) == false); + } finally { + extension.renderOnscreen(); + } + writeToImage = null; + } + + target.drawRasters(paintProps, + new DrawableImage(mosaicImage.getWrappedImage(), coverage)); + // Don't actually render this image now since we just did it + return null; + } else { + GL gl = target.getGl(); + // activate on texture2 as 0 is radar image and 1 is colormap + gl.glActiveTexture(GL.GL_TEXTURE2); + gl.glBindTexture(writeToImage.getTextureStorageType(), + writeToImage.getTextureid()); + return image; + } + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#postImageRender + * (com.raytheon.uf.viz.core.drawables.PaintProperties, + * com.raytheon.viz.core.gl.images.AbstractGLImage, java.lang.Object) + */ + @Override + public void postImageRender(PaintProperties paintProps, + AbstractGLImage image, Object data) throws VizException { + GL gl = target.getGl(); + // activate on texture2 as 0 is radar image and 1 is colormap + gl.glActiveTexture(GL.GL_TEXTURE2); + gl.glBindTexture(writeToImage.getTextureStorageType(), 0); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#loadShaderData + * (com.raytheon.viz.core.gl.glsl.GLShaderProgram, + * com.raytheon.uf.viz.core.drawables.IImage, + * com.raytheon.uf.viz.core.drawables.PaintProperties) + */ + @Override + public void loadShaderData(GLShaderProgram program, IImage image, + PaintProperties paintProps) throws VizException { + program.setUniform("radarData", 0); + program.setUniform("mosaicTexture", 2); + + // pass in width and height + program.setUniform("height", (paintProps.getCanvasBounds().height)); + program.setUniform("width", (paintProps.getCanvasBounds().width)); + } + +} diff --git a/cave/com.raytheon.uf.viz.xy.varheight/src/com/raytheon/uf/viz/xy/varheight/rsc/VarHeightResource.java b/cave/com.raytheon.uf.viz.xy.varheight/src/com/raytheon/uf/viz/xy/varheight/rsc/VarHeightResource.java index 3689fbcbfb..200341ed45 100644 --- a/cave/com.raytheon.uf.viz.xy.varheight/src/com/raytheon/uf/viz/xy/varheight/rsc/VarHeightResource.java +++ b/cave/com.raytheon.uf.viz.xy.varheight/src/com/raytheon/uf/viz/xy/varheight/rsc/VarHeightResource.java @@ -579,14 +579,14 @@ public class VarHeightResource extends XYWindImageData windData = (XYWindImageData) data; double dir = windData.getWindDir(); double speed = windData.getWindSpd(); - double[] screen = hodoDescriptor.worldToPixel(new double[] { + double[] screen = hodoDescriptor.polarToPixel(new double[] { speed, dir }); line.addPoint(screen[0], screen[1]); } } if (!line.points.isEmpty()) { double[] screen = hodoDescriptor - .worldToPixel(new double[] { 0, 0 }); + .polarToPixel(new double[] { 0, 0 }); line.addPoint(screen[0], screen[1]); target.drawLine(line); diff --git a/cave/com.raytheon.uf.viz.xy/src/com/raytheon/uf/viz/xy/graph/XyGraphDescriptor.java b/cave/com.raytheon.uf.viz.xy/src/com/raytheon/uf/viz/xy/graph/XyGraphDescriptor.java index aae09fd524..32f1000741 100644 --- a/cave/com.raytheon.uf.viz.xy/src/com/raytheon/uf/viz/xy/graph/XyGraphDescriptor.java +++ b/cave/com.raytheon.uf.viz.xy/src/com/raytheon/uf/viz/xy/graph/XyGraphDescriptor.java @@ -23,18 +23,10 @@ import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import org.geotools.coverage.grid.GeneralGridEnvelope; -import org.geotools.coverage.grid.GeneralGridGeometry; -import org.geotools.coverage.grid.GridGeometry2D; -import org.geotools.geometry.GeneralEnvelope; import org.geotools.referencing.crs.DefaultEngineeringCRS; -import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.adapters.GridGeometryAdapter; import com.raytheon.uf.viz.core.PixelExtent; import com.raytheon.uf.viz.core.drawables.AbstractDescriptor; import com.raytheon.uf.viz.core.drawables.ResourcePair; @@ -68,24 +60,12 @@ public class XyGraphDescriptor extends AbstractDescriptor implements protected double zoomLevel = 1.0f; - @XmlElement - @XmlJavaTypeAdapter(value = GridGeometryAdapter.class) - protected GeneralGridGeometry geometry; - public XyGraphDescriptor() { this(new PixelExtent(0, 1000, 0, 1000)); } public XyGraphDescriptor(PixelExtent anExtent) { - super(); - GeneralEnvelope envelope = new GeneralEnvelope(2); - envelope.setRange(0, anExtent.getMinX(), anExtent.getMaxX()); - envelope.setRange(1, anExtent.getMinY(), anExtent.getMaxY()); - envelope.setCoordinateReferenceSystem(DefaultEngineeringCRS.CARTESIAN_2D); - geometry = new GridGeometry2D(new GeneralGridEnvelope( - new int[] { 0, 0 }, new int[] { (int) anExtent.getWidth(), - (int) anExtent.getHeight() }, false), envelope); - getResourceList().addPreRemoveListener(this); + super(createGridGeometry(anExtent, DefaultEngineeringCRS.CARTESIAN_2D)); } public IGraph getGraph(IGraphableResource rsc) { @@ -96,42 +76,6 @@ public class XyGraphDescriptor extends AbstractDescriptor implements return null; } - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.drawables.IDescriptor#getCRS() - */ - @Override - public CoordinateReferenceSystem getCRS() { - // TODO Auto-generated method stub - return null; - } - - @Override - public GeneralGridGeometry getGridGeometry() { - return geometry; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.drawables.IDescriptor#pixelToWorld(double[]) - */ - @Override - public double[] pixelToWorld(double[] pixel) { - return pixel; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.drawables.IDescriptor#worldToPixel(double[]) - */ - @Override - public double[] worldToPixel(double[] worldPixel) { - return worldPixel; - } - public GraphResource getGraphResource() { List rscs = resourceList .getResourcesByTypeAsType(GraphResource.class); diff --git a/cave/com.raytheon.uf.viz.xy/src/com/raytheon/uf/viz/xy/hodo/HodographBackgroundResource.java b/cave/com.raytheon.uf.viz.xy/src/com/raytheon/uf/viz/xy/hodo/HodographBackgroundResource.java index fe9802a5f8..bea3a2c0f9 100644 --- a/cave/com.raytheon.uf.viz.xy/src/com/raytheon/uf/viz/xy/hodo/HodographBackgroundResource.java +++ b/cave/com.raytheon.uf.viz.xy/src/com/raytheon/uf/viz/xy/hodo/HodographBackgroundResource.java @@ -112,9 +112,9 @@ public class HodographBackgroundResource extends label.horizontalAlignment = HorizontalAlignment.CENTER; label.textStyle = TextStyle.BLANKED; double[] center = descriptor - .worldToPixel(new double[] { 20, direction }); + .polarToPixel(new double[] { 20, direction }); double[] point = descriptor - .worldToPixel(new double[] { 400, direction }); + .polarToPixel(new double[] { 400, direction }); LineSegment line = new LineSegment(center[0], center[1], point[0], point[1]); LineSegment bottom = new LineSegment(extent.getMinX(), @@ -161,14 +161,14 @@ public class HodographBackgroundResource extends DrawableLine circle = new DrawableLine(); circle.basics.color = GREY; for (int dir = 0; dir <= 36; dir += 1) { - double[] screen = descriptor.worldToPixel(new double[] { + double[] screen = descriptor.polarToPixel(new double[] { mag, dir * 10 }); circle.addPoint(screen[0], screen[1]); } lineList.add(circle); DrawableString label = new DrawableString(String.valueOf(mag), GREY); - double[] screen = descriptor.worldToPixel(new double[] { mag, + double[] screen = descriptor.polarToPixel(new double[] { mag, 225 }); label.setCoordinates(screen[0], screen[1]); label.textStyle = TextStyle.BLANKED; @@ -176,9 +176,9 @@ public class HodographBackgroundResource extends } // Add the lines for (int dir = 0; dir <= 8; dir += 1) { - double[] screen1 = descriptor.worldToPixel(new double[] { 0, + double[] screen1 = descriptor.polarToPixel(new double[] { 0, dir * 45 }); - double[] screen2 = descriptor.worldToPixel(new double[] { 500, + double[] screen2 = descriptor.polarToPixel(new double[] { 500, dir * 45 }); DrawableLine line = new DrawableLine(); line.basics.color = GREY; diff --git a/cave/com.raytheon.uf.viz.xy/src/com/raytheon/uf/viz/xy/hodo/HodographDescriptor.java b/cave/com.raytheon.uf.viz.xy/src/com/raytheon/uf/viz/xy/hodo/HodographDescriptor.java index 59a7195dc7..841c0c7fc3 100644 --- a/cave/com.raytheon.uf.viz.xy/src/com/raytheon/uf/viz/xy/hodo/HodographDescriptor.java +++ b/cave/com.raytheon.uf.viz.xy/src/com/raytheon/uf/viz/xy/hodo/HodographDescriptor.java @@ -19,17 +19,9 @@ **/ package com.raytheon.uf.viz.xy.hodo; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; - -import org.geotools.coverage.grid.GeneralGridEnvelope; import org.geotools.coverage.grid.GeneralGridGeometry; -import org.geotools.coverage.grid.GridGeometry2D; -import org.geotools.geometry.GeneralEnvelope; import org.geotools.referencing.crs.DefaultEngineeringCRS; -import org.opengis.referencing.crs.CoordinateReferenceSystem; -import com.raytheon.uf.common.serialization.adapters.GridGeometryAdapter; import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.drawables.AbstractDescriptor; @@ -55,33 +47,14 @@ public class HodographDescriptor extends AbstractDescriptor { // The max distance of the hodograph private static final double MAX_RANGE = 140.0; - @XmlElement - @XmlJavaTypeAdapter(value = GridGeometryAdapter.class) - protected GeneralGridGeometry geometry; - public HodographDescriptor(IExtent anExtent) { - super(); - GeneralEnvelope envelope = new GeneralEnvelope(2); - envelope.setRange(0, anExtent.getMinX(), anExtent.getMaxX()); - envelope.setRange(1, anExtent.getMinY(), anExtent.getMaxY()); - envelope.setCoordinateReferenceSystem(DefaultEngineeringCRS.CARTESIAN_2D); - geometry = new GridGeometry2D(new GeneralGridEnvelope( - new int[] { 0, 0 }, new int[] { (int) anExtent.getWidth(), - (int) anExtent.getHeight() }, false), envelope); + super(createGridGeometry(anExtent, DefaultEngineeringCRS.CARTESIAN_2D)); } - @Override - public CoordinateReferenceSystem getCRS() { - return null; - } - - @Override - public GeneralGridGeometry getGridGeometry() { - return geometry; - } - - @Override - public double[] pixelToWorld(double[] pixel) { + // Separate functions for polar transformations until we can get it working + // in geotools framework + public double[] pixelToPolar(double[] pixel) { + GeneralGridGeometry geometry = getGridGeometry(); double x = pixel[0]; double y = pixel[1]; int xRange = geometry.getGridRange().getSpan(0); @@ -95,8 +68,8 @@ public class HodographDescriptor extends AbstractDescriptor { return new double[] { r, a, 0 }; } - @Override - public double[] worldToPixel(double[] world) { + public double[] polarToPixel(double[] world) { + GeneralGridGeometry geometry = getGridGeometry(); double r = world[0]; double a = world[1]; int xRange = geometry.getGridRange().getSpan(0); diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourSupport.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourSupport.java index 9ab682eb7a..2c7aeb6cad 100644 --- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourSupport.java +++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourSupport.java @@ -46,6 +46,7 @@ import com.raytheon.uf.common.datastorage.records.FloatDataRecord; import com.raytheon.uf.common.datastorage.records.IDataRecord; import com.raytheon.uf.common.geospatial.CRSCache; import com.raytheon.uf.common.geospatial.MapUtil; +import com.raytheon.uf.common.geospatial.util.WorldWrapChecker; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; @@ -60,7 +61,6 @@ import com.raytheon.uf.viz.core.drawables.IFont; import com.raytheon.uf.viz.core.drawables.IWireframeShape; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.IMapDescriptor; -import com.raytheon.uf.viz.core.map.WorldWrapChecker; import com.raytheon.uf.viz.core.style.LabelingPreferences; import com.raytheon.viz.core.contours.cache.SubGridCacheKey; import com.raytheon.viz.core.contours.util.ContourContainer; @@ -1337,7 +1337,8 @@ public class ContourSupport { throws TransformException { long tZ0 = System.currentTimeMillis(); - WorldWrapChecker wwc = new WorldWrapChecker(descriptor); + WorldWrapChecker wwc = new WorldWrapChecker( + descriptor.getGridGeometry()); List splitLines = new ArrayList(); List dupValues = new ArrayList(); diff --git a/cave/com.raytheon.viz.core.gl/META-INF/MANIFEST.MF b/cave/com.raytheon.viz.core.gl/META-INF/MANIFEST.MF index 21c0bf1aee..6629b1d411 100644 --- a/cave/com.raytheon.viz.core.gl/META-INF/MANIFEST.MF +++ b/cave/com.raytheon.viz.core.gl/META-INF/MANIFEST.MF @@ -21,6 +21,7 @@ Require-Bundle: org.eclipse.ui, Bundle-ActivationPolicy: lazy Export-Package: com.raytheon.viz.core.gl, com.raytheon.viz.core.gl.dataformat, + com.raytheon.viz.core.gl.ext, com.raytheon.viz.core.gl.glsl, com.raytheon.viz.core.gl.images Import-Package: com.raytheon.uf.common.status, diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl/colormap.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl/colormap.glsl index 8c5a291b2a..677106250b 100644 --- a/cave/com.raytheon.viz.core.gl/localization/glsl/colormap.glsl +++ b/cave/com.raytheon.viz.core.gl/localization/glsl/colormap.glsl @@ -1,6 +1,9 @@ // Simple shader program for applying alpha,brightness, and contrast to the // colormap in the same way they are applied to data +#include +#include + uniform float brightness; uniform float contrast; uniform float alphaVal; @@ -15,25 +18,15 @@ uniform sampler2D alphaMask; uniform int applyMask; uniform float logFactor; -vec3 AvgLuminance = vec3(0.5, 0.5, 0.5); - -// Given an index(0-1) find the color in the colormap -vec4 findColor(float index){ - if (logFactor > 0.0){ - float minLog = log(logFactor); - float maxLog = log(logFactor + 1.0); - - float lg = log(logFactor + index); - - index = (lg - minLog) / (maxLog - minLog); - if (index < 0.0){ - index = 0.0; - } - else if (index > 1.0){ - index = 1.0; - } +void main(void){ + // Lookup color in colorMap for index + float index = gl_TexCoord[0].s; + if ( logFactor > 0.0 ) { + index = getLogFactorIndex(index, logFactor); } - vec4 color = texture1D(colorMap, index).rgba; + vec4 color = texture1D(colorMap, index).rgba; + + // Apply alpha mask if set float alpha = color.a; if ( applyMask == 1 ) { if ( texture2D(alphaMask , vec2(index,index) ).r != 0.0 ) { @@ -48,18 +41,6 @@ vec4 findColor(float index){ color.b*color.a + bkgrndBlue*(1.0 - color.a), alpha); } - return vec4(color.rgb, alpha); -} -// Apply the preferences for contrast, alpha, and brightness -vec4 applyContrastAlphaBrightness(vec4 color){ - vec3 textureColor3 = vec3(color); - vec3 adjustedColor = mix(AvgLuminance, textureColor3, contrast); - float curAlpha = min(color.a, alphaVal); - return vec4(adjustedColor.r * brightness, adjustedColor.g * brightness, adjustedColor.b * brightness, curAlpha); -} - -void main(void){ - vec4 textureColor = findColor(gl_TexCoord[0].s); - gl_FragColor = applyContrastAlphaBrightness(textureColor); + gl_FragColor = applyContrastAlphaBrightness(color, alphaVal, brightness, contrast); } \ No newline at end of file diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl/colormapRaster.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl/colormapRaster.glsl new file mode 100644 index 0000000000..611851ddf7 --- /dev/null +++ b/cave/com.raytheon.viz.core.gl/localization/glsl/colormapRaster.glsl @@ -0,0 +1,56 @@ +#include +#include + +uniform float alpha; +uniform float brightness; +uniform float contrast; +uniform int applyMask; +uniform float naturalMin; +uniform float naturalMax; +uniform float cmapMin; +uniform float cmapMax; +uniform sampler1D colorMap; +uniform sampler2D alphaMask; +uniform sampler2D rawTex; +uniform float colorMapSz; +uniform int isFloat; +uniform int logarithmic; +uniform int mirror; +uniform float logFactor; + +void main(void) { + vec4 textureColor = texture2D(rawTex, gl_TexCoord[0].st); + float index = 0.0; + float rawValue = textureColor.r; + if ( isFloat == 1 ) { + if ( logarithmic == 1 ) { + index = findFloatIndexLog(rawValue, cmapMin, cmapMax, mirror); + } else { + index = findFloatIndex(rawValue, cmapMin, cmapMax); + } + + // Special float handling, -1.0 is NaN + if (index == -1.0){ + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); + return; + } + } else { + float naturalValue = ((rawValue * (naturalMax - naturalMin)) + naturalMin); + index = findIndex(naturalValue, cmapMin, cmapMax); + } + + // Lookup color in colorMap for index + if ( logFactor > 0.0 ) { + index = getLogFactorIndex(index, logFactor); + } + textureColor = texture1D(colorMap, index).rgba; + + // Apply alpha mask + if ( applyMask == 1 ) { + if ( texture2D(alphaMask , vec2(index,index) ).r != 0.0 ) { + textureColor = vec4(textureColor.rgb, 0.0); + } + } + + gl_FragColor = applyContrastAlphaBrightness(textureColor, alpha, brightness, contrast); +} \ No newline at end of file diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl/include/colorUtil.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl/include/colorUtil.glsl new file mode 100644 index 0000000000..a448be537d --- /dev/null +++ b/cave/com.raytheon.viz.core.gl/localization/glsl/include/colorUtil.glsl @@ -0,0 +1,34 @@ + +vec3 AvgLuminance = vec3(0.5, 0.5, 0.5); + +/** + * This function applies the specified alpha, brightness, and contrast values + * to the color passed in + */ +vec4 applyContrastAlphaBrightness(vec4 color, float alpha, float brightness, float contrast){ + vec3 textureColor3 = vec3(color); + vec3 adjustedColor = mix(AvgLuminance, textureColor3, contrast); + float curAlpha = min(color.a, alpha); + return vec4(adjustedColor.r * brightness, adjustedColor.g * brightness, adjustedColor.b * brightness, curAlpha); +} + +/** + * This function calculates a new index to use based on the logFactor + */ +float getLogFactorIndex(float index, float logFactor) { + if (logFactor > 0.0){ + float minLog = log(logFactor); + float maxLog = log(logFactor + 1.0); + + float lg = log(logFactor + index); + + index = (lg - minLog) / (maxLog - minLog); + if (index < 0.0){ + index = 0.0; + } + else if (index > 1.0){ + index = 1.0; + } + } + return index; +} \ No newline at end of file diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl/include/indexing.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl/include/indexing.glsl new file mode 100644 index 0000000000..151107d561 --- /dev/null +++ b/cave/com.raytheon.viz.core.gl/localization/glsl/include/indexing.glsl @@ -0,0 +1,104 @@ + +float HALF_FLOAT_NaN = 65504.0; + +/** + * This function takes an index number and caps it to the range 0-1 + */ +float capIndex(float index) { + if ( index < 0.0 ) { + index = 0.0; + } else if ( index > 1.0 ) { + index = 1.0; + } + return index; +} + +/** + * This function linearly finds the index for the rawValue into cmapMin/cmapMax. + * 65504.0 is treated as NaN for half floats and -1 is returned as special case + */ +float findFloatIndex(float rawValue, float cmapMin, float cmapMax) { + if ( rawValue == HALF_FLOAT_NaN ) { + return -1.0; + } + float index = ((rawValue - cmapMin) / abs(cmapMax-cmapMin)); + return capIndex(index); +} + +/** + * This function logarithmically finds the index for the rawValue into cmapMin/cmapMax. + * 65504.0 is treated as NaN for half floats and -1 is returned as special case + */ +float findFloatIndexLog(float rawValue, float cmapMin, float cmapMax, int mirror) { + if ( rawValue == HALF_FLOAT_NaN ) { + return -1.0; + } + + float index = 0.0; + // is this strictly negative, strictly positive or neg to pos scaling? + if ( cmapMin >= 0.0 && cmapMax >= 0.0 && mirror!=1) { + if(rawValue < cmapMin){ + index = 0.0; + }else{ + // simple calculation + index = ((log(rawValue) - log(cmapMin)) / abs(log(cmapMax)-log(cmapMin))); + } + } else if (cmapMin <= 0.0 && cmapMax <= 0.0 && mirror!=1) { + index = ((log(rawValue) - log(cmapMax)) / abs(log(cmapMin)-log(cmapMax))); + } else { + // special case, neg to pos: + float colorMapMin = cmapMin; + float colorMapMax = cmapMax; + float zeroVal = max(colorMapMax, abs(colorMapMin)) * 0.0001; + if (mirror==1 && (colorMapMin > 0.0 || colorMapMax < 0.0)) { + if (colorMapMax < 0.0) { + colorMapMax = -cmapMax; + rawValue = -rawValue; + zeroVal = -colorMapMin; + } else { + zeroVal = cmapMin; + } + colorMapMin = -cmapMax; + } + float leftZero = 0.0; + float rightZero = 0.0; + float absLogZeroVal = abs(log(zeroVal)); + + rightZero = absLogZeroVal + log(colorMapMax); + + float cmapMax2 = abs(colorMapMin); + + leftZero = absLogZeroVal + log(cmapMax2); + + float zeroIndex = leftZero / (leftZero + rightZero); + + // figure out index for texture val + float absTextureColor = abs(rawValue); + if (absTextureColor <= zeroVal) { + index = zeroIndex; + } else if (rawValue > 0.0) { + // positive texture color value, find index from 0 to + // cmapMax: + float logTexColor = absLogZeroVal + log(rawValue); + + float texIndex = logTexColor / rightZero; + index = (zeroIndex + ((1.0 - zeroIndex) * texIndex)); + } else { + // negative texture color value, find index from 0 to + // cmapMax: + float logTexColor = absLogZeroVal + log(absTextureColor); + + float texIndex = logTexColor / leftZero; + index = (zeroIndex - (zeroIndex * texIndex)); + } + } + return capIndex(index); +} + +/** + * Given a raw data value linearly determine the index(0-1) into cmapMin/cmapMax + */ +float findIndex(float rawValue, float cmapMin, float cmapMax) { + float index = ((rawValue - cmapMin) / abs(cmapMax-cmapMin)); + return capIndex(index); +} diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl/raster.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl/raster.glsl index 961d5a4225..a682fb1742 100644 --- a/cave/com.raytheon.viz.core.gl/localization/glsl/raster.glsl +++ b/cave/com.raytheon.viz.core.gl/localization/glsl/raster.glsl @@ -1,172 +1,11 @@ -// NOTE: 65504.0 is the maximum half precision float value -// it is used to do masking of GFE grids since NaNs are not supported -// in NVIDIA cards prior to the 8000 series -// The check for textureColor.r == 65504.0 can be replaced by -// isnan(textureColor.r) if support for cards prior to the 8000 series -// is not required. - -// NOTE: there is a corresponding conversion from NaN to 65504.0 in -// FloatDataPreparer that will also need to be changed +#include uniform float brightness; uniform float contrast; -uniform int doColorMap; -uniform int applyMask; -uniform float naturalMin; -uniform float naturalMax; -uniform float cmapMin; -uniform float cmapMax; -uniform sampler1D colorMap; +uniform float alpha; uniform sampler2D rawTex; -uniform sampler2D alphaMask; -uniform float alphaVal; -uniform float colorMapSz; -uniform int isFloat; -uniform int logarithmic; -uniform int mirror; -uniform float logFactor; -uniform int doSingleColor; -uniform vec3 singleColor; -vec3 AvgLuminance = vec3(0.5, 0.5, 0.5); - -// Given a raw data value determine the index(0-1) into the colormap using log scaling -float findIndexLog(float rawValue){ - float index = 0.0; - // is this strictly negative, strictly positive or neg to pos scaling? - if ( cmapMin >= 0.0 && cmapMax >= 0.0 && mirror!=1) { - if(rawValue < cmapMin){ - index = 0.0; - }else{ - // simple calculation - index = ((log(rawValue) - log(cmapMin)) / abs(log(cmapMax)-log(cmapMin))); - } - } else if (cmapMin <= 0.0 && cmapMax <= 0.0 && mirror!=1) { - index = ((log(rawValue) - log(cmapMax)) / abs(log(cmapMin)-log(cmapMax))); - } else { - // special case, neg to pos: - float colorMapMin = cmapMin; - float colorMapMax = cmapMax; - float zeroVal = max(colorMapMax, abs(colorMapMin)) * 0.0001; - if (mirror==1 && (colorMapMin > 0.0 || colorMapMax < 0.0)) { - if (colorMapMax < 0.0) { - colorMapMax = -cmapMax; - rawValue = -rawValue; - zeroVal = -colorMapMin; - } else { - zeroVal = cmapMin; - } - colorMapMin = -cmapMax; - } - float leftZero = 0.0; - float rightZero = 0.0; - float absLogZeroVal = abs(log(zeroVal)); - - rightZero = absLogZeroVal + log(colorMapMax); - - float cmapMax2 = abs(colorMapMin); - - leftZero = absLogZeroVal + log(cmapMax2); - - float zeroIndex = leftZero / (leftZero + rightZero); - - // figure out index for texture val - float absTextureColor = abs(rawValue); - if (absTextureColor <= zeroVal) { - index = zeroIndex; - } else if (rawValue > 0.0) { - // positive texture color value, find index from 0 to - // cmapMax: - float logTexColor = absLogZeroVal + log(rawValue); - - float texIndex = logTexColor / rightZero; - index = (zeroIndex + ((1.0 - zeroIndex) * texIndex)); - } else { - // negative texture color value, find index from 0 to - // cmapMax: - float logTexColor = absLogZeroVal + log(absTextureColor); - - float texIndex = logTexColor / leftZero; - index = (zeroIndex - (zeroIndex * texIndex)); - } - } - return index; -} - -// Given a raw data value determine the index(0-1) into the colormap -float findIndex(float rawValue) -{ - float index = 0.0; - if (isFloat == 1) { - if (rawValue == 65504.0) { - return -1.0; - } - if (logarithmic == 1){ - index = findIndexLog(rawValue); - }else{ - index = ((rawValue - cmapMin) / abs(cmapMax-cmapMin)); - } - } else { - float naturalValue = ((rawValue * (naturalMax - naturalMin)) + naturalMin); - index = ((naturalValue - cmapMin) / abs(cmapMax-cmapMin)); - } - if(index < 0.0) { - index = 0.0; - } else if(index > 1.0) { - index = 1.0; - } - return index; -} - -// Given an index(0-1) find the color in the colormap -vec4 findColor(float index){ - if (logFactor > 0.0){ - float minLog = log(logFactor); - float maxLog = log(logFactor + 1.0); - - float lg = log(logFactor + index); - - index = (lg - minLog) / (maxLog - minLog); - if (index < 0.0){ - index = 0.0; - } - else if (index > 1.0){ - index = 1.0; - } - } - vec4 color = texture1D(colorMap, index).rgba; - float alpha = color.a; - if ( applyMask == 1 ) { - if ( texture2D(alphaMask , vec2(index,index) ).r != 0.0 ) { - alpha = 0.0; - } - } - return vec4(color.rgb, alpha); -} - -// Apply the preferences for contrast, alpha, and brightness -vec4 applyContrastAlphaBrightness(vec4 color){ - vec3 textureColor3 = vec3(color); - vec3 adjustedColor = mix(AvgLuminance, textureColor3, contrast); - float curAlpha = min(color.a, alphaVal); - return vec4(adjustedColor.r * brightness, adjustedColor.g * brightness, adjustedColor.b * brightness, curAlpha); -} - -void main(void) -{ +void main(void) { vec4 textureColor = texture2D(rawTex, gl_TexCoord[0].st); - float alpha = textureColor.a; - if(doColorMap == 1) { - float index = findIndex(textureColor.r); - if (index == -1.0){ - gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); - return; - } - textureColor = findColor(index); - } - - if ( doSingleColor == 1 ) { - textureColor.rgb = singleColor; - } - gl_FragColor = applyContrastAlphaBrightness(textureColor); + gl_FragColor = applyContrastAlphaBrightness(textureColor, alpha, brightness, contrast); } \ No newline at end of file diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl/singleColor.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl/singleColor.glsl new file mode 100644 index 0000000000..c1b999b79a --- /dev/null +++ b/cave/com.raytheon.viz.core.gl/localization/glsl/singleColor.glsl @@ -0,0 +1,13 @@ +#include + +uniform float brightness; +uniform float contrast; +uniform float alpha; +uniform sampler2D rawTex; +uniform vec3 color; + +void main(void) { + vec4 textureColor = texture2D(rawTex, gl_TexCoord[0].st); + textureColor.rgb = color; + gl_FragColor = applyContrastAlphaBrightness(textureColor, alpha, brightness, contrast); +} \ No newline at end of file diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl_old/clouds.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl_old/clouds.glsl deleted file mode 100644 index 1a6bde0b6f..0000000000 --- a/cave/com.raytheon.viz.core.gl/localization/glsl_old/clouds.glsl +++ /dev/null @@ -1,59 +0,0 @@ -uniform float brightness; -uniform float contrast; -uniform sampler1D colorMap; -uniform int textureType; -uniform sampler2D cloudTexture2D; -uniform sampler3D cloudTexture3D; -uniform float glaze; -uniform float rime; -uniform float alphaVal; -uniform int clwSize; -uniform float clwRange[8]; -uniform float naturalValues[2]; -uniform float cmap[]; - -vec3 AvgLuminance = vec3(0.5, 0.5, 0.5); - -float getValue(sampler2D s2D, sampler3D s3D, float max, float min) { - - float value; - if(textureType == 3) { - value = texture3D(s3D, vec3(gl_TexCoord[0])).r; - }else { - value = texture2D(s2D, vec2(gl_TexCoord[0])).r; - } - - // scale the value - value = (value *(max-min)) + min; - return value; - -} - -void main(void) -{ - gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0 ); - - float temp = getValue(cloudTexture2D, cloudTexture3D, naturalValues[1], naturalValues[0] ); - - float index = ((temp - cmap[0]) / (cmap[1]-cmap[0])); - if(index < 0.0) { - index = 0.0; - } else if(index > 1.0) { - index = 1.0; - } - - vec4 color = texture1D(colorMap, index).rgba; - - float alpha = color.a; - vec4 textureColor = vec4(color.rgb, 1.0); - - vec3 adjustedColor = mix(AvgLuminance, color.rgb, contrast); - float curAlpha = min(alpha, alphaVal); - -//// if(curAlpha > 0.0) { - gl_FragColor = vec4(adjustedColor.r * brightness, adjustedColor.g * brightness, adjustedColor.b * brightness, curAlpha); - // } else { - // discard; - // } - -} diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl_old/drawRaster.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl_old/drawRaster.glsl deleted file mode 100644 index 14a4d8060e..0000000000 --- a/cave/com.raytheon.viz.core.gl/localization/glsl_old/drawRaster.glsl +++ /dev/null @@ -1,37 +0,0 @@ -uniform sampler2D tex; -uniform float brightness; -uniform float contrast; -uniform int doColorMap; -uniform float naturalMin; -uniform float naturalMax; -uniform float cmapMin; -uniform float cmapMax; -uniform sampler1D colorMap; -uniform sampler2D rawTex; -uniform float alphaVal; -uniform float colorMapSz; -vec3 AvgLuminance = vec3(0.5, 0.5, 0.5); - -void main(void) -{ - vec4 textureColor = texture2D(rawTex, gl_TexCoord[0].st); - float alpha = textureColor.a; - if(doColorMap == 1) { - // + " float naturalValue = ((textureColor.r * (20000)) - 10000); - float naturalValue = ((textureColor.r * (naturalMax - naturalMin)) + naturalMin); - float index = ((naturalValue - cmapMin) / abs(cmapMax-cmapMin)); - if(index < 0.0) { - index = 0.0; - } else if(index > 1.0) { - index = 1.0; - } - vec4 color = texture1D(colorMap, index).rgba; - alpha = color.a; - textureColor = vec4(color.rgb, 1.0); - } - vec3 textureColor3 = vec3(textureColor); - vec3 adjustedColor = mix(AvgLuminance, textureColor3, contrast); - float curAlpha = min(alpha, alphaVal); - gl_FragColor = vec4(adjustedColor.r * brightness, adjustedColor.g * brightness, adjustedColor.b * brightness, curAlpha); - -} diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl_old/drawRaster3D.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl_old/drawRaster3D.glsl deleted file mode 100644 index 67d61ef624..0000000000 --- a/cave/com.raytheon.viz.core.gl/localization/glsl_old/drawRaster3D.glsl +++ /dev/null @@ -1,98 +0,0 @@ -uniform sampler3D tex; -uniform float brightness; -uniform float contrast; -uniform int doColorMap; -uniform float naturalMin; -uniform float naturalMax; -uniform float cmapMin; -uniform float cmapMax; -uniform sampler1D colorMap; -uniform sampler3D rawTex; -uniform float alphaVal; -uniform float colorMapSz; -uniform sampler2D grids[8]; -uniform int enabledImpacts[8]; -uniform int numberEnabled; - -//// actuall pressure levels -//uniform float pressures[20]; -//uniform int layers; -// -// -//uniform float texturePres[30]; - -vec3 AvgLuminance = vec3(0.5, 0.5, 0.5); - -//float interp1(float y1, float y3, float x1, float x2, float x3) { -// if(x3 == x1) { -// x1 += 0.01; -// } -// -// return y1+((y3-y1) *((x2-x1)/(x3-x1))); -// -//} -// -//// based on metolib pvalue.f -//float pvalue() { -// -// float z = vec3(gl_TexCoord[0].xyz).z; -// int j = int(z *float(layers-1)); -// vec3 lower = gl_TexCoord[0].xyz; -// vec3 upper = gl_TexCoord[0].xyz; -// -// -// float lowerVal = texture3D(rawTex, lower).r; -// float uperVal = texture3D(rawTex, upper).r; -// -// for(int i = 0; i < layers; ++i) { -// -// if(pressures[i] < texturePres[j]) { -// -// // assuming texture coordinates are 0-1 -// lower.z += 1/(layers-1); -// upper.z -= 1/(layers-1); -// -// float lowerVal = texture3D(rawTex, lower).r; -// float upperVal = texture3D(rawTex, upper).r; -// -// float p1 = log(pressures[i-1]); -// float p2 = log(texturePres[j]); -// float p3 = log(pressures[i]); -// -// return interp1(lowerVal, upperVal, p1, p2, p3 ); -// } -// } -// -//} - - -void main(void) -{ - float textureValue = texture3D(rawTex, gl_TexCoord[0].xyz).r; - - float naturalValue = ((textureValue * (naturalMax - naturalMin)) + naturalMin); - float index = ((naturalValue - cmapMin) / (cmapMax-cmapMin)); - if(index < 0.0) { - index = 0.0; - } else if(index > 1.0) { - index = 1.0; - } - vec4 color = texture1D(colorMap, index).rgba; - float alpha = color.a; - vec4 textureColor = vec4(color.rgb, 1.0); - - - vec3 textureColor3 = vec3(textureColor); - vec3 adjustedColor = mix(AvgLuminance, textureColor3, contrast); -// - float curAlpha = min(alpha, alphaVal); - - if(curAlpha > 0.0){ - gl_FragColor = vec4(adjustedColor.r * brightness, adjustedColor.g * brightness, adjustedColor.b * brightness, curAlpha); - } - else { - discard; - } - - -} diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl_old/heatIndex.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl_old/heatIndex.glsl deleted file mode 100644 index aab680e130..0000000000 --- a/cave/com.raytheon.viz.core.gl/localization/glsl_old/heatIndex.glsl +++ /dev/null @@ -1,56 +0,0 @@ -uniform sampler2D temp2D; -uniform sampler3D temp3D; -uniform sampler2D rh2D; -uniform sampler3D rh3D; -uniform int textureType; -uniform float naturalMin[2]; -uniform float naturalMax[2]; -uniform float severeThreshold; -uniform float moderateThreshold; - -float getValue(sampler2D s2D, sampler3D s3D, float max, float min) { - - float value; - if(textureType == 3) { - value = texture3D(s3D, vec3(gl_TexCoord[0])).r; - }else { - value = texture2D(s2D, vec2(gl_TexCoord[0])).r; - } - - // scale the value - value = (value *(max-min)) + min; - return value; -} - - -void main(void) -{ - - - float kelvin = getValue(temp2D, temp3D, naturalMax[0], naturalMin[0]); - - float t = (((kelvin - 273.15) * 1.8) + 32.0); - - float rh = getValue(rh2D, rh3D, naturalMax[1], naturalMin[1]); - - - float hi = t; - if(t >= 57.0) { - hi = -42.379 + (2.04901523*t) + (10.14333127*rh) - (0.22475541*t*rh) - (0.00683783*t*t) - (0.05481717*rh*rh) + (0.00122874*t*t*rh)+ (0.00085282*t*rh*rh) - (0.00000199*((t*rh)*(t*rh))); - } - - gl_FragColor =vec4(1.0, 0.0, 1.0, 1.0); - // convert threshold values to fahenheit - if(hi > (severeThreshold *9.0/5.0 -459.67)) { - gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); - - } else if(hi > (moderateThreshold *9.0/5.0 -459.67)) { - gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); - } - else { - discard; -// gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); - - } - -} diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl_old/icing.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl_old/icing.glsl deleted file mode 100644 index 1e05d56572..0000000000 --- a/cave/com.raytheon.viz.core.gl/localization/glsl_old/icing.glsl +++ /dev/null @@ -1,125 +0,0 @@ -uniform float brightness; -uniform float contrast; -uniform sampler1D colorMap; -uniform sampler3D tempTex3D; -uniform sampler3D clwTex3D; -uniform sampler2D tempTex2D; -uniform sampler2D clwTex2D; -uniform sampler2D tempTex; -uniform sampler2D clwTex; -uniform float glaze; -uniform float rime; -uniform float alphaVal; -uniform int clwSize; -uniform float clwRange[4]; -uniform float naturalMin[2]; -uniform float naturalMax[2]; -uniform int textureType; -vec3 AvgLuminance = vec3(0.5, 0.5, 0.5); - -// shader based on icing algorithm found at -// http://aoaws.caa.gov.tw/htdocs/projects/aoaws/model/icing/algorithm -// - - -// get the scaled value from either the 2D or 3D texture -float getValue(sampler2D s2D, sampler3D s3D, float max, float min) { - - float value; - if(textureType == 3) { - value = texture3D(s3D, vec3(gl_TexCoord[0])).r; - }else { - value = texture2D(s2D, vec2(gl_TexCoord[0])).r; - } - - // scale the value - value = (value *(max-min)) + min; - return value; -} - - - -float getIcing() -{ - - float value = 0.0; - - float temp = getValue(tempTex2D, tempTex3D, naturalMax[0], naturalMin[0]); - - // clw - cloud liquid water - float clw = getValue(clwTex2D, clwTex3D, naturalMax[1], naturalMin[1]); - - if(temp > glaze || clw < clwRange[0]) { - // no icing - value = 0.0; - } - else { - - if(temp < rime){ - value = 1.0; - } - else { - value = 2.0; - } - - float x = 0.0; - for(int i = 0; i < 4; i++) { - if(clw > clwRange[i] ){ - x += 1.0 ; - - } - } - value += x; - } - - return value; -} - - -void main(void) -{ - gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0 ); - -// vec4 textureColor = texture2D(tempTex, gl_TexCoord[0].st); -// float alpha = textureColor.a; - - float index1 = getIcing(); - -// if(index1 == 900.0 ) { -// gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0 ); -// -// } -// else if(index1 == 10000.0) { -// gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0 ); -// -// } else if(index1 == 999.0) { -// gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0 ); -// -// } -// else { - - float index = (index1 / 5.0); - if(index < 0.0) { - index = 0.0; - } else if(index > 1.0) { - index = 1.0; - } - - vec4 color = texture1D(colorMap, index).rgba; - - float alpha = color.a; - vec4 textureColor = vec4(color.rgb, 1.0); - - vec3 textureColor3 = vec3(textureColor); - - vec3 adjustedColor = mix(AvgLuminance, textureColor3, contrast); - float curAlpha = min(alpha, alphaVal); - - if(alpha > 0.0) { - gl_FragColor = vec4(adjustedColor.r * brightness, adjustedColor.g * brightness, adjustedColor.b * brightness, alpha); - } - else { - discard; - } - -} diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl_old/main.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl_old/main.glsl deleted file mode 100644 index 0d35401419..0000000000 --- a/cave/com.raytheon.viz.core.gl/localization/glsl_old/main.glsl +++ /dev/null @@ -1,157 +0,0 @@ -uniform sampler2D tex; -uniform float brightness; -uniform float contrast; -uniform int doColorMap; -uniform float naturalMin; -uniform float naturalMax; -uniform float cmapMin; -uniform float cmapMax; -uniform sampler1D colorMap; -uniform sampler2D rawTex; -uniform float alphaVal; -uniform float colorMapSz; -uniform int doImpact; -uniform int upperThreshold; -uniform int numberGrids; -uniform float severeThreshold[8]; -uniform float moderateThreshold[8]; -uniform float naturalMins[8]; -uniform float naturalMaxes[8]; -uniform sampler2D grids[8]; -uniform int enabledImpacts[8]; -uniform int numberEnabled; -vec3 AvgLuminance = vec3(0.5, 0.5, 0.5); - -float impactAnd() -{ - float impactVal = 3.0; - for(int x=0; x < 8; x++) - { - if(x >= numberGrids) - { - break; - } - if(enabledImpacts[x] == 1) - { - vec4 textureColor = texture2D(grids[x], gl_TexCoord[0].st); - float naturalValue = ((textureColor.r * (naturalMaxes[x] - naturalMins[x])) + naturalMins[x]); - if(upperThreshold == 1) - { - if(naturalValue < moderateThreshold[x]) - { - impactVal = 0.0; - } - else if(naturalValue < severeThreshold[x]) - { - if(impactVal == 3.0) - { - impactVal = 2.0; - } - } - } - else - { - if(naturalValue > moderateThreshold[x]) - { - impactVal = 0.0; - } - else if(naturalValue > severeThreshold[x]) - { - if(impactVal == 3.0) - { - impactVal = 2.0; - } - } - } - } - } - - return impactVal; -} - -float impactOr() -{ - float impactVal = 0.0; - for(int x=0; x < 8; x++) - { - if(x >= numberGrids) - { - break; - } - if(enabledImpacts[x] == 1) - { - vec4 textureColor = texture2D(grids[x], gl_TexCoord[0].st); - float naturalValue = ((textureColor.r * (naturalMaxes[x] - naturalMins[x])) + naturalMins[x]); - if(upperThreshold == 1) - { - if(naturalValue > severeThreshold[x]) - { - impactVal = 3.0; - } - else if(naturalValue > moderateThreshold[x]) - { - impactVal = 2.0; - } - } - else - { - if(naturalValue < severeThreshold[x]) - { - impactVal = 3.0; - } - else if(naturalValue < moderateThreshold[x]) - { - impactVal = 2.0; - } - } - } - } - - return impactVal; -} - - -void main(void) -{ - vec4 textureColor = texture2D(rawTex, gl_TexCoord[0].st); - float alpha = textureColor.a; - if(doImpact == 1) - { - float impactVal = 0.0; - if(numberEnabled > 0) - { - impactVal = impactAnd(); - } - else - { - impactVal = 0.0; - } - - float index = (impactVal / 3.0); - if(index < 0.0) { - index = 0.0; - } else if(index > 1.0) { - index = 1.0; - } - vec4 color = texture1D(colorMap, index).rgba; - alpha = color.a; - textureColor = vec4(color.rgb, 1.0); - } - else if(doColorMap == 1) { - float naturalValue = ((textureColor.r * (naturalMax - naturalMin)) + naturalMin); - float index = ((naturalValue - cmapMin) / (cmapMax-cmapMin)); - if(index < 0.0) { - index = 0.0; - } else if(index > 1.0) { - index = 1.0; - } - vec4 color = texture1D(colorMap, index).rgba; - alpha = color.a; - textureColor = vec4(color.rgb, 1.0); - } - vec3 textureColor3 = vec3(textureColor); - vec3 adjustedColor = mix(AvgLuminance, textureColor3, contrast); - float curAlpha = min(alpha, alphaVal); - gl_FragColor = vec4(adjustedColor.r * brightness, adjustedColor.g * brightness, adjustedColor.b * brightness, curAlpha); - -} diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl_old/terrain.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl_old/terrain.glsl deleted file mode 100644 index d18b4dc4c4..0000000000 --- a/cave/com.raytheon.viz.core.gl/localization/glsl_old/terrain.glsl +++ /dev/null @@ -1,19 +0,0 @@ -uniform sampler2D terrainMap; -uniform float exaggeration; -uniform int layer; - -void main(void) -{ - vec4 newVertexPos; - float df; - - gl_TexCoord[0].xy = gl_MultiTexCoord0.xy; - vec3 normal = normalize(gl_Normal); - df = texture2D( terrainMap, gl_TexCoord[0].xy ).r; - if(layer > 0){ - exaggeration *= layer; - } - newVertexPos = vec4(normal *df* exaggeration , 0.0) + gl_Vertex; - - gl_Position = gl_ModelViewProjectionMatrix * newVertexPos; -} \ No newline at end of file diff --git a/cave/com.raytheon.viz.core.gl/plugin.xml b/cave/com.raytheon.viz.core.gl/plugin.xml index c79f6296dd..fd854f43c2 100644 --- a/cave/com.raytheon.viz.core.gl/plugin.xml +++ b/cave/com.raytheon.viz.core.gl/plugin.xml @@ -20,13 +20,8 @@ --> - - - - - @@ -44,7 +39,7 @@ class="com.raytheon.viz.core.gl.internal.ext.GLColormapShadedShapeExtension"> + class="com.raytheon.viz.core.gl.ext.GLOffscreenRenderingExtension"> @@ -52,5 +47,11 @@ + + + + diff --git a/cave/com.raytheon.viz.core.gl/schema/shader.exsd b/cave/com.raytheon.viz.core.gl/schema/shader.exsd deleted file mode 100644 index ec795ae0f1..0000000000 --- a/cave/com.raytheon.viz.core.gl/schema/shader.exsd +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - This extension point is used to identify shader programs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.1 - - - - - - - - diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/AbstractGLMesh.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/AbstractGLMesh.java index 7ef7c820eb..f5c950a751 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/AbstractGLMesh.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/AbstractGLMesh.java @@ -19,31 +19,31 @@ **/ package com.raytheon.viz.core.gl; -import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; import javax.media.opengl.GL; +import org.geotools.coverage.grid.GeneralGridGeometry; import org.geotools.coverage.grid.GridGeometry2D; -import org.geotools.referencing.CRS; -import org.geotools.referencing.crs.DefaultGeographicCRS; +import org.geotools.referencing.operation.DefaultMathTransformFactory; +import org.opengis.referencing.datum.PixelInCell; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.TransformException; +import com.raytheon.uf.common.geospatial.MapUtil; +import com.raytheon.uf.common.geospatial.util.WorldWrapChecker; +import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.IMesh; -import com.raytheon.uf.viz.core.PixelCoverage; import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.PaintStatus; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.map.IMapDescriptor; -import com.raytheon.uf.viz.core.map.WorldWrapChecker; -import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; +import com.raytheon.uf.viz.core.jobs.JobPool; import com.raytheon.viz.core.gl.GLGeometryObject2D.GLGeometryObjectData; import com.raytheon.viz.core.gl.SharedCoordMap.SharedCoordinateKey; import com.raytheon.viz.core.gl.SharedCoordMap.SharedCoordinates; -import com.vividsolutions.jts.geom.Envelope; /** * Abstract GLMesh @@ -63,35 +63,76 @@ import com.vividsolutions.jts.geom.Envelope; public abstract class AbstractGLMesh implements IMesh { - protected boolean shouldDraw = true; + private static final JobPool calculator = new JobPool("Mesh Calculator", 2, + false); - private boolean compiled = false; + protected static enum State { + NEW, CALCULATING, CALCULATED, COMPILED, INVALID; + } - protected GLGeometryObject2D vertexCoords; + private State internalState = State.NEW; - protected SharedCoordinateKey key; + private GLGeometryObject2D vertexCoords; private SharedCoordinates sharedTextureCoords; - protected IMapDescriptor descriptor; + protected SharedCoordinateKey key; - public AbstractGLMesh(int geometryType, IMapDescriptor descriptor) { - vertexCoords = new GLGeometryObject2D(new GLGeometryObjectData( - geometryType, GL.GL_VERTEX_ARRAY)); - this.descriptor = descriptor; + private Runnable calculate = new Runnable() { + @Override + public void run() { + synchronized (calculate) { + if (internalState == State.CALCULATING) { + // If we aren't in CALCULATING state, we were disposed while + // waiting to run and shouldn't run now + if (calculateMesh()) { + internalState = State.CALCULATED; + } else { + internalState = State.INVALID; + } + } + } + } + }; + + private int geometryType; + + private MathTransform imageCRSToLatLon; + + private MathTransform latLonToTargetGrid; + + private GeneralGridGeometry targetGeometry; + + private GridGeometry2D imageGeometry; + + protected AbstractGLMesh(int geometryType) { + this.geometryType = geometryType; } - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.IMesh#paint(com.raytheon.viz.core.IGraphicsTarget) - */ - @Override - public synchronized void paint(IGraphicsTarget target, + protected final void initialize(GridGeometry2D imageGeometry, + GeneralGridGeometry targetGeometry) throws VizException { + this.imageGeometry = imageGeometry; + if (imageGeometry != null) { + try { + imageCRSToLatLon = MapUtil.getTransformToLatLon(imageGeometry + .getCoordinateReferenceSystem()); + } catch (Throwable t) { + throw new VizException( + "Error construcing image to lat/lon transform", t); + } + } + reproject(targetGeometry); + } + + public final synchronized PaintStatus paint(IGraphicsTarget target, PaintProperties paintProps) throws VizException { - if (!shouldDraw) { - return; + State internalState = this.internalState; + if (internalState == State.NEW) { + throw new VizException( + "Class did not properly call initialize on construction"); + } else if (internalState == State.INVALID) { + // Don't paint if invalid to avoid crashes + return PaintStatus.ERROR; } IGLTarget glTarget; @@ -101,65 +142,91 @@ public abstract class AbstractGLMesh implements IMesh { glTarget = (IGLTarget) target; - if (sharedTextureCoords == null) { - sharedTextureCoords = SharedCoordMap.get(key, glTarget); - } + try { + if (internalState == State.CALCULATED) { + // We finished calculating the mesh, compile it + sharedTextureCoords = SharedCoordMap.get(key, glTarget); + vertexCoords.compile(glTarget.getGl()); + this.internalState = internalState = State.COMPILED; + } - if (!compiled) { - vertexCoords.compile(glTarget.getGl()); - compiled = true; + if (internalState == State.COMPILED) { + GLGeometryPainter.paintGeometries(glTarget.getGl(), + vertexCoords, sharedTextureCoords.getTextureCoords()); + return PaintStatus.PAINTED; + } else if (internalState == State.CALCULATING) { + target.setNeedsRefresh(true); + return PaintStatus.REPAINT; + } else { + return PaintStatus.ERROR; + } + } catch (VizException e) { + this.internalState = State.INVALID; + throw e; } - - GLGeometryPainter.paintGeometries(glTarget.getGl(), vertexCoords, - sharedTextureCoords.getTextureCoords()); } @Override public synchronized void dispose() { - vertexCoords.dispose(); - if (sharedTextureCoords != null) { - SharedCoordMap.remove(key); - sharedTextureCoords = null; + // Synchronize on calculate so we don't dispose while running + synchronized (calculate) { + // Cancel calculation job from running + calculator.cancel(calculate); + // dispose and reset vertexCoords + if (vertexCoords != null) { + vertexCoords.dispose(); + vertexCoords = null; + } + if (sharedTextureCoords != null) { + SharedCoordMap.remove(key); + sharedTextureCoords = null; + } + internalState = State.INVALID; } - shouldDraw = false; } /* * (non-Javadoc) * - * @see - * com.raytheon.viz.core.IMesh#calculateMesh(com.raytheon.viz.core.PixelCoverage - * , org.opengis.coverage.grid.GridGeometry) + * @see com.raytheon.uf.viz.core.IMesh#reproject(org.geotools.coverage.grid. + * GeneralGridGeometry) */ - public void calculateMesh(PixelCoverage pc, GridGeometry2D gg) { - MathTransform toLL = null; - ImageTile tile = null; - try { - toLL = CRS.findMathTransform(gg.getCoordinateReferenceSystem(), - DefaultGeographicCRS.WGS84); - tile = new ImageTile(); - tile.coverage = pc; - tile.rect = new Rectangle(gg.getGridRange().getLow(0), gg - .getGridRange().getLow(1), gg.getGridRange().getHigh(0), gg - .getGridRange().getHigh(1)); - tile.envelope = new Envelope(gg.getEnvelope().getMinimum(0), gg - .getEnvelope().getMaximum(0), gg.getEnvelope() - .getMinimum(1), gg.getEnvelope().getMaximum(1)); - } catch (Exception e) { + @Override + public final void reproject(GeneralGridGeometry targetGeometry) + throws VizException { + if (targetGeometry.equals(this.targetGeometry) == false) { + dispose(); + this.targetGeometry = targetGeometry; + + // Set up convenience transforms + try { + DefaultMathTransformFactory factory = new DefaultMathTransformFactory(); + latLonToTargetGrid = factory.createConcatenatedTransform( + MapUtil.getTransformFromLatLon(targetGeometry + .getCoordinateReferenceSystem()), + targetGeometry.getGridToCRS(PixelInCell.CELL_CENTER) + .inverse()); + } catch (Throwable t) { + internalState = State.INVALID; + throw new VizException("Error projecting mesh", t); + } + + internalState = State.CALCULATING; + calculator.schedule(calculate); } - calculateMesh(pc, tile, toLL); } - @Override - public void calculateMesh(PixelCoverage pc, ImageTile tile, MathTransform mt) { - shouldDraw = false; - key = generateKey(tile, mt); + private boolean calculateMesh() { + key = generateKey(imageGeometry, imageCRSToLatLon); try { - double[][][] worldCoordinates = generateWorldCoords(tile, mt); + double[][][] worldCoordinates = generateWorldCoords(imageGeometry, + imageCRSToLatLon); + vertexCoords = new GLGeometryObject2D(new GLGeometryObjectData( + geometryType, GL.GL_VERTEX_ARRAY)); vertexCoords.allocate(worldCoordinates.length * worldCoordinates[0].length); // Check for world wrapping - WorldWrapChecker wwc = new WorldWrapChecker(descriptor); + WorldWrapChecker wwc = new WorldWrapChecker(targetGeometry); for (int i = 0; i < worldCoordinates.length; ++i) { double[][] strip = worldCoordinates[i]; @@ -176,7 +243,7 @@ public abstract class AbstractGLMesh implements IMesh { prev1 = null; prev2 = null; } - vSegment.add(descriptor.worldToPixel(next)); + vSegment.add(worldToPixel(next)); prev2 = prev1; prev1 = next; @@ -185,14 +252,28 @@ public abstract class AbstractGLMesh implements IMesh { vertexCoords.addSegment(vSegment.toArray(new double[vSegment .size()][])); } - - shouldDraw = true; + return true; } catch (Exception e) { - e.printStackTrace(); - shouldDraw = false; + Activator.statusHandler.handle(Priority.PROBLEM, + "Error calculating mesh", e); } + return false; + } - pc.setMesh(this); + protected final double[] worldToPixel(double[] world) { + double[] in = null; + if (world.length == 2) { + in = new double[] { world[0], world[1], 0.0 }; + } else { + in = world; + } + double[] out = new double[in.length]; + try { + latLonToTargetGrid.transform(in, 0, out, 0, 1); + } catch (TransformException e) { + return null; + } + return out; } /* @@ -207,10 +288,11 @@ public abstract class AbstractGLMesh implements IMesh { return false; } - protected abstract SharedCoordinateKey generateKey(ImageTile tile, - MathTransform mt); + protected abstract SharedCoordinateKey generateKey( + GridGeometry2D imageGeometry, MathTransform mt); - protected abstract double[][][] generateWorldCoords(ImageTile tile, - MathTransform mt) throws TransformException; + protected abstract double[][][] generateWorldCoords( + GridGeometry2D imageGeometry, MathTransform mt) + throws TransformException; } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/Activator.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/Activator.java index 0a21f5e45f..42a74c7483 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/Activator.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/Activator.java @@ -19,7 +19,6 @@ **/ package com.raytheon.viz.core.gl; -import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.preference.IPersistentPreferenceStore; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; @@ -34,7 +33,8 @@ import com.raytheon.uf.viz.core.localization.HierarchicalPreferenceStore; * The activator class controls the plug-in life cycle */ public class Activator extends AbstractUIPlugin { - private static final transient IUFStatusHandler statusHandler = UFStatus + + public static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(Activator.class); // The plug-in ID @@ -62,12 +62,6 @@ public class Activator extends AbstractUIPlugin { */ public void start(BundleContext context) throws Exception { super.start(context); - // Start the texture loader job - TextureLoaderJob textureLoader = TextureLoaderJob.getInstance(); - if (textureLoader.getState() != Job.RUNNING) { - textureLoader.setSystem(true); - textureLoader.schedule(); - } } /* @@ -80,11 +74,6 @@ public class Activator extends AbstractUIPlugin { public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); - // Start the texture loader job - TextureLoaderJob textureLoader = TextureLoaderJob.getInstance(); - if (textureLoader.getState() == Job.RUNNING) { - textureLoader.shutdown(); - } } /** diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/GLFactoryAdapter.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/GLFactoryAdapter.java index 9efc266f01..8886c02d86 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/GLFactoryAdapter.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/GLFactoryAdapter.java @@ -151,17 +151,4 @@ public class GLFactoryAdapter extends AbstractGraphicsFactoryAdapter { return canvas; } - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.AbstractGraphicsFactoryAdapter#disposeCanvas - * (org.eclipse.swt.widgets.Canvas) - */ - @Override - public void disposeCanvas(Canvas canvas) { - if (!canvas.isDisposed()) { - canvas.getParent().dispose(); - } - } } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/GLGeometryPainter.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/GLGeometryPainter.java index f7753e05a5..8f125409d1 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/GLGeometryPainter.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/GLGeometryPainter.java @@ -48,8 +48,6 @@ import com.raytheon.viz.core.gl.GLGeometryObject2D.State; public class GLGeometryPainter { - private static int maxVertices = -1; - public static void paintGeometries(GL gl, GLGeometryObject2D... geoms) throws VizException { State state = State.INVALID; diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/IGLTarget.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/IGLTarget.java index ef117db9fa..b959ee50a0 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/IGLTarget.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/IGLTarget.java @@ -24,14 +24,9 @@ import javax.media.opengl.glu.GLU; import org.eclipse.swt.graphics.Rectangle; -import com.raytheon.uf.viz.core.DrawableImage; import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelCoverage; -import com.raytheon.uf.viz.core.drawables.IImage; -import com.raytheon.uf.viz.core.drawables.IRenderableDisplay; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.gl.images.GLColormappedImage; +import com.raytheon.uf.viz.core.drawables.ColorMapParameters; +import com.raytheon.viz.core.gl.objects.GLTextureObject; public interface IGLTarget extends IGraphicsTarget { @@ -39,13 +34,9 @@ public interface IGLTarget extends IGraphicsTarget { public abstract GLU getGlu(); - /** - * Active texture unit and bind a texture - * - * @param textureUnit - * @param GLImage - */ - public abstract void bindTexture(int textureUnit, GLColormappedImage image); + public abstract void pushGLState(); + + public abstract void popGLState(); /** * @@ -59,6 +50,12 @@ public interface IGLTarget extends IGraphicsTarget { */ public abstract void releaseContext(); + /** + * + * @return + */ + public abstract void releaseContext(); + /** * Get the modle view matrix settings * @@ -107,70 +104,13 @@ public interface IGLTarget extends IGraphicsTarget { public abstract Rectangle getBounds(); /** - * Dispose a vbo + * Get a colormap texture id for the specified parameters * - * @param id - * the vbo id - */ - public abstract void disposeVBO(int id); - - /** - * Dispose the occlusion query - * - * @param id - */ - public abstract void disposeOcclusionQueries(int[] id); - - /** - * - * @param display - * @throws VizException - */ - public void beginOcclusionTest(IRenderableDisplay display) - throws VizException; - - /** - * End the occlusion test. Commands will update the framebuffer - * - * @throws VizException - */ - public void endOcclusionTest() throws VizException; - - /** - * call drawRaster using a specified shader program - * - * @param image - * @param extent - * @param paintProps - * @param shaderProgram + * @param cmapParams * @return - * @throws VizException */ - public abstract boolean drawRaster(IImage image, PixelCoverage extent, - PaintProperties paintProps, String shaderProgram) - throws VizException; - - /** - * call drawRaster with a specified shader program - * - * @param image - * the image reference object to draw - * @param extent - * the extent of the drawable area - * @param paintProps - * the paint properties - * @param mode - * the drawing mode (synchronous, asynchronous) - * @return status whether the raster was able to be drawn - * @throws VizException - */ - public abstract boolean drawRaster(IImage image, PixelCoverage extent, - PaintProperties paintProps, RasterMode mode, String shaderProgram) - throws VizException; - - public abstract boolean drawRasters(String shader, - PaintProperties paintProps, DrawableImage... images) - throws VizException; + public abstract GLTextureObject getColorMapTexture( + ColorMapParameters cmapParams); /** * Checks the glError state and does a UFStatus message diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/SharedCoordMap.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/SharedCoordMap.java index 9b7d794460..68d79d72f1 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/SharedCoordMap.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/SharedCoordMap.java @@ -153,14 +153,13 @@ public class SharedCoordMap { */ private static void populateTextureGeom(SharedCoordinateKey key, GLGeometryObject2D geom) { - geom.allocate(key.verticalDivisions * key.horizontalDivisions * 2); - - int height = 2 * key.verticalDivisions; + int height = 2 * (key.verticalDivisions + 1); int width = key.horizontalDivisions; + geom.allocate(width * height * 2); // get dx and dy for texture points float dX = (1.0f / (key.horizontalDivisions)); - float dY = (1.0f / (key.verticalDivisions - 1)); + float dY = (1.0f / (key.verticalDivisions)); float xLow, xHigh = 0; diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/TextureLoaderJob.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/TextureLoaderJob.java deleted file mode 100644 index 8a40d526a4..0000000000 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/TextureLoaderJob.java +++ /dev/null @@ -1,210 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ - -package com.raytheon.viz.core.gl; - -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.LinkedBlockingQueue; - -import javax.media.opengl.GLContext; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; - -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.gl.images.AbstractGLImage; - -/** - * Job that demand-loads textures into GL. - *

- * - * If a multiple ImageIO.reads are incurred simultaneously, the performance is - * horrible. By having only one texture load occur at a time in a different - * (non-blocking) thread, with adequate pause between texture loads, this - * problem is alleviated. - * - *

- * 
- *    SOFTWARE HISTORY
- *   
- *    Date          Ticket#     Engineer    Description
- *    ------------	----------	-----------	--------------------------
- *    7/1/06                    chammack    Initial Creation.
- * 
- * 
- * - * @author chammack - * - */ -public class TextureLoaderJob extends Job { - - /** Number of things to keep on the queue before starting to remove some */ - private static final int MAX_QUEUE_SIZE = 256; - - /** The instance */ - private static TextureLoaderJob instance; - - /** Time (in ms) for the texture job to sleep (NEVER SET TO ZERO) */ - private static final int TEXTURE_JOB_SLEEP_TIME = 2; - - /** A flag to indicate whether the job should continue running */ - private boolean isRunning = true; - - /** A queue of images to load */ - private final Queue texturesToLoad; - - /** A thread safe list of images to load */ - private final ConcurrentLinkedQueue texturesToLoadToGPU; - - /** - * Internal datastructure: used to populate the queues - */ - private class Request { - public AbstractGLImage image; - - public GLContext ctx; - } - - /** - * Get the currently running instance of the texture loader - * - * @return - */ - public static TextureLoaderJob getInstance() { - if (instance == null) { - instance = new TextureLoaderJob(); - } - return instance; - } - - /** - * Use getInstance() instead of constructor - * - */ - private TextureLoaderJob() { - super("Texture Loader"); - this.texturesToLoad = new LinkedBlockingQueue(); - this.texturesToLoadToGPU = new ConcurrentLinkedQueue(); - } - - /** - * Request an image to be loaded - * - * @param img - * the image - */ - public void requestLoad(AbstractGLImage img) { - if (!this.texturesToLoad.contains(img)) - this.texturesToLoad.add(img); - } - - public void requestLoadIntoTexture(AbstractGLImage img, GLContext ctx) { - Request req = new Request(); - req.image = img; - req.ctx = ctx; - - this.texturesToLoadToGPU.add(req); - - } - - /* - * (non-Javadoc) - * - * @seeorg.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime. - * IProgressMonitor) - */ - @Override - protected IStatus run(IProgressMonitor monitor) { - - while (this.isRunning) { - while (this.texturesToLoad.size() > MAX_QUEUE_SIZE) { - this.texturesToLoad.poll(); - } - - while (this.texturesToLoad.size() > 0) { - AbstractGLImage image = this.texturesToLoad.remove(); - if (image.getStatus() == com.raytheon.uf.viz.core.drawables.IImage.Status.STAGED - || image.getStatus() == com.raytheon.uf.viz.core.drawables.IImage.Status.LOADED) { - continue; - } - try { - image.stageTexture(); - } catch (VizException e) { - Activator - .getDefault() - .getLog() - .log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, - "Staging texture failed", e)); - } - } - try { - Thread.sleep(TEXTURE_JOB_SLEEP_TIME); - } catch (InterruptedException e) { - } - - // while (this.texturesToLoadToGPU.size() > MAX_QUEUE_SIZE) { - // this.texturesToLoadToGPU.remove(); - // } - // - // while (this.texturesToLoadToGPU.size() > 0) { - // final Request request = this.texturesToLoadToGPU.remove(); - // - // if (request.image.getStatus() == IImage.Status.LOADED - // || request.image.getStatus() == IImage.Status.FAILED) { - // continue; - // } - // VizApp.runSync(new Runnable() { - // - // public void run() { - // try { - // request.image.loadTexture(request.ctx); - // } catch (VizException e) { - // // Set an exception that the drawing subsystem will - // // pick - // // up and log properly/display to user - // request.image.setStatus(IImage.Status.FAILED); - // request.image.setFailedMessage(e); - // } - // } - // - // }); - // - // } - // try { - // Thread.sleep(TEXTURE_JOB_SLEEP_TIME); - // } catch (InterruptedException e) { - // } - - } - return Status.OK_STATUS; - } - - /** - * Request the job to be shut down - * - */ - public void shutdown() { - this.isRunning = false; - } - -} diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLShortDataFormat.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLShortDataFormat.java index 19c692b852..bcbb01caa1 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLShortDataFormat.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLShortDataFormat.java @@ -83,7 +83,7 @@ public class GLShortDataFormat extends AbstractGLColorMapDataFormat { * (int, int, com.raytheon.viz.core.gl.dataprep.GLColorMapData) */ @Override - public Short getValue(int x, int y, GLColorMapData data) { + public Number getValue(int x, int y, GLColorMapData data) { if (!(data.getData() instanceof ShortBuffer)) { throw new IllegalArgumentException( "Expecting data to contain a ShortBuffer but instead it is a " diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLUnsignedShortDataFormat.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLUnsignedShortDataFormat.java index 88d6c7b702..8f430b8054 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLUnsignedShortDataFormat.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLUnsignedShortDataFormat.java @@ -60,7 +60,7 @@ public class GLUnsignedShortDataFormat extends GLShortDataFormat { * int, com.raytheon.viz.core.gl.dataformat.GLColorMapData) */ @Override - public Short getValue(int x, int y, GLColorMapData data) { + public Number getValue(int x, int y, GLColorMapData data) { if (!(data.getData() instanceof ShortBuffer)) { throw new IllegalArgumentException( "Expecting data to contain a ShortBuffer but instead it is a " @@ -69,7 +69,7 @@ public class GLUnsignedShortDataFormat extends GLShortDataFormat { int width = getAlignedWidth(data.getDimensionSize(0)); int index = y * width + x; ShortBuffer buffer = (ShortBuffer) data.getData(); - return buffer.get(index); + return (buffer.get(index) & 0xFFFF); } } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/AbstractGLImagingExtension.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/AbstractGLImagingExtension.java new file mode 100644 index 0000000000..dcbc900633 --- /dev/null +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/AbstractGLImagingExtension.java @@ -0,0 +1,373 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.viz.core.gl.ext; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.util.HashSet; +import java.util.Set; + +import javax.media.opengl.GL; + +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.viz.core.DrawableImage; +import com.raytheon.uf.viz.core.IMesh; +import com.raytheon.uf.viz.core.PixelCoverage; +import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.drawables.IImage.Status; +import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.PaintStatus; +import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension; +import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.viz.core.gl.AbstractGLMesh; +import com.raytheon.viz.core.gl.GLCapabilities; +import com.raytheon.viz.core.gl.IGLTarget; +import com.raytheon.viz.core.gl.glsl.GLSLFactory; +import com.raytheon.viz.core.gl.glsl.GLShaderProgram; +import com.raytheon.viz.core.gl.images.AbstractGLImage; +import com.sun.opengl.util.texture.TextureCoords; +import com.vividsolutions.jts.geom.Coordinate; + +/** + * Abstract GL Imaging extension class + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Dec 15, 2011            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public abstract class AbstractGLImagingExtension extends + GraphicsExtension implements IImagingExtension { + + protected static final IUFStatusHandler statusHandler = UFStatus + .getHandler(AbstractGLImagingExtension.class); + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.drawables.ext.IImagingExtension#drawRasters( + * com.raytheon.uf.viz.core.drawables.PaintProperties, + * com.raytheon.uf.viz.core.DrawableImage[]) + */ + @Override + public final boolean drawRasters(PaintProperties paintProps, + DrawableImage... images) throws VizException { + GL gl = target.getGl(); + boolean rval = true; + gl.glGetError(); + + target.pushGLState(); + try { + gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL); + rval = drawRastersInternal(paintProps, images); + gl.glPolygonMode(GL.GL_BACK, GL.GL_LINE); + gl.glDisable(GL.GL_BLEND); + } finally { + target.popGLState(); + } + + target.handleError(gl.glGetError()); + return rval; + } + + protected boolean drawRastersInternal(PaintProperties paintProps, + DrawableImage... images) throws VizException { + GL gl = target.getGl(); + GLCapabilities capabilities = GLCapabilities.getInstance(gl); + // Get shader program extension uses + String shaderProgram = getShaderProgramName(); + + int repaints = 0; + Set errorMsgs = new HashSet(); + + GLShaderProgram program = null; + boolean attemptedToLoadShader = false; + int lastTextureType = -1; + + for (DrawableImage di : images) { + AbstractGLImage glImage = (AbstractGLImage) di.getImage(); + PixelCoverage extent = di.getCoverage(); + + synchronized (glImage) { + if (glImage.getStatus() == Status.STAGED) { + glImage.target(target); + } + + if (glImage.getStatus() != Status.LOADED) { + ++repaints; + continue; + } + + int textureType = glImage.getTextureStorageType(); + + if (lastTextureType != textureType) { + if (lastTextureType != -1) { + gl.glDisable(lastTextureType); + } + gl.glEnable(textureType); + lastTextureType = textureType; + } + + Object dataObj = null; + + if (glImage.bind(gl)) { + // Notify extension image is about to be rendered + dataObj = preImageRender(paintProps, glImage, extent); + + if (dataObj == null) { + // Skip image if preImageRender returned null + continue; + } + + if (shaderProgram != null + && capabilities.cardSupportsShaders) { + if (program == null && !attemptedToLoadShader) { + attemptedToLoadShader = true; + program = GLSLFactory.getInstance() + .getShaderProgram(target, null, + shaderProgram); + if (program != null) { + program.startShader(); + } + + gl.glTexEnvi(GL.GL_TEXTURE_ENV, + GL.GL_TEXTURE_ENV_MODE, GL.GL_ADD); + gl.glEnable(GL.GL_BLEND); + gl.glTexEnvi(GL.GL_TEXTURE_ENV, + GL.GL_TEXTURE_ENV_MODE, GL.GL_BLEND); + gl.glBlendFunc(GL.GL_SRC_ALPHA, + GL.GL_ONE_MINUS_SRC_ALPHA); + + gl.glColor4f(0.0f, 0.0f, 0.0f, + paintProps.getAlpha()); + } + + if (program != null) { + loadShaderData(program, glImage, paintProps); + } + } else { + gl.glEnable(GL.GL_BLEND); + gl.glBlendFunc(GL.GL_SRC_ALPHA, + GL.GL_ONE_MINUS_SRC_ALPHA); + gl.glColor4f(1.0f, 1.0f, 1.0f, paintProps.getAlpha()); + } + + if (drawCoverage(paintProps, extent, + glImage.getTextureCoords(), 0) == PaintStatus.REPAINT) { + // Coverage not ready, needs repaint + ++repaints; + } + + gl.glActiveTexture(GL.GL_TEXTURE0); + gl.glBindTexture(textureType, 0); + + // Notify extension image has been rendered + postImageRender(paintProps, glImage, dataObj); + + // Enable if you want to see mesh drawn + if (false) { + if (program != null) { + program.endShader(); + } + gl.glDisable(GL.GL_BLEND); + gl.glColor3f(0.0f, 1.0f, 0.0f); + gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINE); + drawCoverage(paintProps, extent, + glImage.getTextureCoords(), 0); + gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL); + gl.glEnable(GL.GL_BLEND); + if (program != null) { + program.startShader(); + } + } + } else { + errorMsgs.add("Texture did not bind"); + continue; + } + } + } + + if (lastTextureType != -1) { + gl.glDisable(lastTextureType); + } + + if (program != null) { + program.endShader(); + } + + if (errorMsgs.size() > 0) { + throw new VizException("Error rendering " + errorMsgs.size() + + " images: " + errorMsgs); + } + + boolean needsRepaint = repaints > 0; + if (needsRepaint) { + target.setNeedsRefresh(true); + } + + return needsRepaint == false; + } + + /** + * Draw an image coverage object + * + * @param paintProps + * @param pc + * @param coords + * @param corrFactor + * @throws VizException + */ + protected PaintStatus drawCoverage(PaintProperties paintProps, + PixelCoverage pc, TextureCoords coords, float corrFactor) + throws VizException { + GL gl = target.getGl(); + if (pc == null) { + return PaintStatus.ERROR; + } + // gl.glPolygonMode(GL.GL_BACK, GL.GL_FILL); + // gl.glColor3d(1.0, 0.0, 0.0); + // } + + // boolean useNormals = false; + IMesh mesh = pc.getMesh(); + + // if mesh exists, use it + if (mesh != null) { + if (mesh instanceof AbstractGLMesh) { + return ((AbstractGLMesh) mesh).paint(target, paintProps); + } + } else if (coords != null) { + FloatBuffer fb = ByteBuffer.allocateDirect(4 * 5 * 4) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + + Coordinate ul = pc.getUl(); + Coordinate ur = pc.getUr(); + Coordinate lr = pc.getLr(); + Coordinate ll = pc.getLl(); + + fb.put(new float[] { coords.left() + corrFactor, + coords.bottom() + corrFactor }); + fb.put(new float[] { (float) ll.x, (float) ll.y, (float) ll.z }); + + fb.put(new float[] { coords.right() - corrFactor, + coords.bottom() + corrFactor }); + fb.put(new float[] { (float) lr.x, (float) lr.y, (float) lr.z }); + + fb.put(new float[] { coords.left() + corrFactor, + coords.top() - corrFactor }); + fb.put(new float[] { (float) ul.x, (float) ul.y, (float) ul.z }); + + fb.put(new float[] { coords.right() - corrFactor, + coords.top() - corrFactor }); + fb.put(new float[] { (float) ur.x, (float) ur.y, (float) ur.z }); + + // Clear error bit + gl.glGetError(); + + gl.glEnableClientState(GL.GL_VERTEX_ARRAY); + gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY); + + gl.glInterleavedArrays(GL.GL_T2F_V3F, 0, fb.rewind()); + int error = gl.glGetError(); + if (error == GL.GL_NO_ERROR) { + gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, 4); + } else { + target.handleError(error); + } + + gl.glDisableClientState(GL.GL_VERTEX_ARRAY); + gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY); + return PaintStatus.PAINTED; + } + return PaintStatus.ERROR; + } + + /** + * Setup anything that is required pre image rendering. Object returned is a + * state object and will be passed in to postImageRender. If the image + * should not be drawn, return null + * + * @param paintProps + * @param image + * @return + * @throws VizException + */ + public Object preImageRender(PaintProperties paintProps, + AbstractGLImage image, PixelCoverage imageCoverage) + throws VizException { + return this; + } + + /** + * Post image rendering method, can be used to change any state required. + * Return object from preImageRender is passed in as data argument + * + * @param paintProps + * @param image + * @param data + * @throws VizException + */ + public void postImageRender(PaintProperties paintProps, + AbstractGLImage image, Object data) throws VizException { + + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension# + * getCompatibilityValue(com.raytheon.uf.viz.core.IGraphicsTarget) + */ + @Override + public int getCompatibilityValue(IGLTarget target) { + return Compatibilty.TARGET_COMPATIBLE; + } + + /** + * The shader program name to execute for this extension + * + * @return + */ + public abstract String getShaderProgramName(); + + /** + * Populate the shader program with data required for execution + * + * @param program + * @param image + * @param paintProps + * @throws VizException + */ + public abstract void loadShaderData(GLShaderProgram program, IImage image, + PaintProperties paintProps) throws VizException; +} diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLOffscreenRenderingExtension.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/GLOffscreenRenderingExtension.java similarity index 91% rename from cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLOffscreenRenderingExtension.java rename to cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/GLOffscreenRenderingExtension.java index 2a54154aec..90f77f275e 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLOffscreenRenderingExtension.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/GLOffscreenRenderingExtension.java @@ -1,4 +1,4 @@ -package com.raytheon.viz.core.gl.internal.ext; +package com.raytheon.viz.core.gl.ext; import java.nio.Buffer; import java.nio.ByteBuffer; @@ -12,13 +12,13 @@ import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension; import com.raytheon.uf.viz.core.drawables.ext.IOffscreenRenderingExtension; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IColormappedImageExtension; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.core.gl.IGLTarget; import com.raytheon.viz.core.gl.dataformat.AbstractGLColorMapDataFormat; import com.raytheon.viz.core.gl.dataformat.GLByteDataFormat; import com.raytheon.viz.core.gl.dataformat.IGLColorMapDataFormatProvider; import com.raytheon.viz.core.gl.images.AbstractGLImage; +import com.raytheon.viz.core.gl.internal.ext.GLColormappedImageExtension; public class GLOffscreenRenderingExtension extends GraphicsExtension implements IOffscreenRenderingExtension { @@ -37,7 +37,7 @@ public class GLOffscreenRenderingExtension extends GraphicsExtension if (glImage.getStatus() == IImage.Status.UNLOADED || glImage.getStatus() == IImage.Status.LOADING) { glImage.setStatus(IImage.Status.LOADING); - glImage.stageTexture(); + glImage.stage(); } if (glImage.getStatus() == IImage.Status.STAGED) { @@ -63,7 +63,7 @@ public class GLOffscreenRenderingExtension extends GraphicsExtension */ @Override public int getCompatibilityValue(IGLTarget target) { - return Compatibilty.TARGET_COMPATIBLE.value; + return Compatibilty.TARGET_COMPATIBLE; } /* @@ -73,8 +73,9 @@ public class GLOffscreenRenderingExtension extends GraphicsExtension * constructOffscreenImage(java.lang.Class, java.awt.Rectangle) */ @Override - public IImage constructOffscreenImage(Class dataType, - int[] dimensions) throws VizException { + public AbstractGLImage constructOffscreenImage( + Class dataType, int[] dimensions) + throws VizException { return constructOffscreenImage(dataType, dimensions, null); } @@ -85,9 +86,9 @@ public class GLOffscreenRenderingExtension extends GraphicsExtension * constructOffscreenImage(java.lang.Class, java.awt.Rectangle) */ @Override - public IImage constructOffscreenImage(Class dataType, - final int[] dimensions, ColorMapParameters parameters) - throws VizException { + public AbstractGLImage constructOffscreenImage( + Class dataType, final int[] dimensions, + ColorMapParameters parameters) throws VizException { int width = dimensions[0]; int height = dimensions[1]; // Need to add support for multiple buffer types @@ -102,10 +103,10 @@ public class GLOffscreenRenderingExtension extends GraphicsExtension } if (imageBuffer != null) { - IImage image = null; + AbstractGLImage image = null; final Buffer buffer = imageBuffer; - IColormappedImageExtension cmapExt = target - .getExtension(IColormappedImageExtension.class); + GLColormappedImageExtension cmapExt = target + .getExtension(GLColormappedImageExtension.class); if (supportsLuminance) { image = cmapExt.initializeRaster( new IColorMapDataRetrievalCallback() { diff --git a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/GLRadarMosaicRendererFactory.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/AbstractGLSLImagingExtension.java similarity index 52% rename from cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/GLRadarMosaicRendererFactory.java rename to cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/AbstractGLSLImagingExtension.java index 70a7d8009e..058ec899f7 100644 --- a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/GLRadarMosaicRendererFactory.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/AbstractGLSLImagingExtension.java @@ -17,16 +17,15 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.uf.viz.radar.gl.mosaic; +package com.raytheon.viz.core.gl.glsl; -import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension; -import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.viz.core.gl.GLCapabilities; import com.raytheon.viz.core.gl.IGLTarget; -import com.raytheon.viz.radar.rsc.mosaic.MergeRasterRadarMosaicRenderer; -import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicRendererFactoryExtension; +import com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension; +import com.raytheon.viz.core.gl.internal.GLTarget; /** - * Radar mosaic renderer factory for IGLTarget + * Abstract GL Extension that requires shader to work properly * *
  * 
@@ -34,7 +33,7 @@ import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicRendererFactoryExtensio
  * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
- * Nov 22, 2011            mschenke     Initial creation
+ * Dec 15, 2011            mschenke     Initial creation
  * 
  * 
* @@ -42,28 +41,8 @@ import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicRendererFactoryExtensio * @version 1.0 */ -public class GLRadarMosaicRendererFactory extends GraphicsExtension - implements IRadarMosaicRendererFactoryExtension { - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicRendererFactoryExtension - * #createNewRenderer() - */ - @Override - public IRadarMosaicRenderer createNewRenderer(MosaicType mosaicType) - throws VizException { - switch (mosaicType) { - case MergeRaster: - return new MergeRasterRadarMosaicRenderer(); - case MaxValue: - return new RadarMosaicRenderer(); - } - throw new VizException("Could not find mosaic renderer for type = " - + mosaicType); - } +public abstract class AbstractGLSLImagingExtension extends + AbstractGLImagingExtension { /* * (non-Javadoc) @@ -73,7 +52,12 @@ public class GLRadarMosaicRendererFactory extends GraphicsExtension */ @Override public int getCompatibilityValue(IGLTarget target) { - return Compatibilty.TARGET_COMPATIBLE.value; + if (GLCapabilities.getInstance(target.getGl()).cardSupportsShaders + && GLTarget.FORCE_NO_SHADER == false) { + return Compatibilty.ENHANCED_TARGET_COMPATIBLE; + } else { + return Compatibilty.INCOMPATIBLE; + } } } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/GLSLFactory.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/GLSLFactory.java index ff676ac70b..445e9804b8 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/GLSLFactory.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/GLSLFactory.java @@ -22,15 +22,6 @@ package com.raytheon.viz.core.gl.glsl; import java.util.HashMap; import java.util.Map; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.core.runtime.IExtension; -import org.eclipse.core.runtime.IExtensionPoint; -import org.eclipse.core.runtime.IExtensionRegistry; -import org.eclipse.core.runtime.Platform; - -import com.raytheon.uf.viz.core.drawables.IImage; -import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.core.gl.IGLTarget; import com.raytheon.viz.core.gl.glsl.internal.GLProgramManager; @@ -58,45 +49,7 @@ public class GLSLFactory { private final Map shadersPrograms = new HashMap(); - private static final Map shaderProgramMap = new HashMap(); - - static { - // Construct the resource mapping from Eclipse plugins - IExtensionRegistry registry = Platform.getExtensionRegistry(); - IExtensionPoint point = registry - .getExtensionPoint("com.raytheon.viz.core.gl.shader"); - if (point != null) { - IExtension[] extensions = point.getExtensions(); - - for (int i = 0; i < extensions.length; ++i) { - IConfigurationElement[] config = extensions[i] - .getConfigurationElements(); - - for (int j = 0; j < config.length; j++) { - String name = config[j].getAttribute("programName"); - shaderProgramMap.put(name, config[j]); - } - } - - } - } - - public static void registerProgramLoader(String name, IShaderLoader loader) { - shaderProgramMap.put(name, loader); - } - private GLSLFactory() { - // Register vetex.glsl as the default vertex program loader - IShaderLoader loader = new AbstractShaderLoader() { - @Override - public void loadData(IGLTarget target, GLShaderProgram program, - IImage image, PaintProperties paintProps) - throws VizException { - // does nothing - } - }; - loader.setName(DEFAULT_VERTEX); - registerProgramLoader(loader.getName(), loader); } /** @@ -133,68 +86,17 @@ public class GLSLFactory { String shaderName = new String(vertexName + "_" + fragName); GLShaderProgram shader = shadersPrograms.get(shaderName); if (shader == null - || GLProgramManager.getInstance().hasBeenModified(fragName, - false) - || GLProgramManager.getInstance().hasBeenModified(vertexName, - false)) { + || GLProgramManager.getInstance().hasBeenModified(fragName) + || GLProgramManager.getInstance().hasBeenModified(vertexName)) { if (shader != null) { shader.dispose(); } - // program object not cached, construct - IShaderLoader vertexShader = null; - if (vertexName != null) { - vertexShader = getShaderLoaderInstance(shaderProgramMap - .get(vertexName)); - } - IShaderLoader fragmentShader = null; - if (fragName != null) { - fragmentShader = getShaderLoaderInstance(shaderProgramMap - .get(fragName)); - fragmentShader.setName(fragName); - } - shader = new GLShaderProgram(target, shaderName, vertexShader, - fragmentShader); + shader = new GLShaderProgram(target, shaderName, vertexName, + fragName); shadersPrograms.put(shaderName, shader); } - if (shader != null) { - Object fshader = shaderProgramMap.get(fragName); - Object vshader = shaderProgramMap.get(vertexName); - if (fshader != null && fshader instanceof IShaderLoader - && shader.getFragmentShader() != fshader) { - shader.updateFragmentShader((IShaderLoader) fshader); - } - if (vshader != null && vshader instanceof IShaderLoader - && shader.getVertexShader() != vshader) { - shader.updateVertexShader((IShaderLoader) vshader); - } - } - return shader; } - - /** - * Construct an instance of the shader loader class - * - * @param className - * @return - */ - private IShaderLoader getShaderLoaderInstance(Object object) - throws VizException { - if (object instanceof IConfigurationElement) { - IConfigurationElement configElement = (IConfigurationElement) object; - try { - return (IShaderLoader) configElement - .createExecutableExtension("loaderClass"); - } catch (CoreException e) { - throw new VizException( - "Error constructing instance of loader class: " - + configElement.getAttribute("loaderClass"), e); - } - } else if (object instanceof IShaderLoader) { - return (IShaderLoader) object; - } - return null; - } } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/GLSLRasterProgramLoader.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/GLSLRasterProgramLoader.java deleted file mode 100644 index 8a8c22e78c..0000000000 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/GLSLRasterProgramLoader.java +++ /dev/null @@ -1,133 +0,0 @@ -/** - * This software was developed and / or modified by Raytheon Company, - * pursuant to Contract DG133W-05-CQ-1067 with the US Government. - * - * U.S. EXPORT CONTROLLED TECHNICAL DATA - * This software product contains export-restricted data whose - * export/transfer/disclosure is restricted by U.S. law. Dissemination - * to non-U.S. persons whether in the United States or abroad requires - * an export license or other authorization. - * - * Contractor Name: Raytheon Company - * Contractor Address: 6825 Pine Street, Suite 340 - * Mail Stop B8 - * Omaha, NE 68106 - * 402.291.0100 - * - * See the AWIPS II Master Rights File ("Master Rights File.pdf") for - * further licensing information. - **/ -package com.raytheon.viz.core.gl.glsl; - -import javax.media.opengl.GL; - -import com.raytheon.uf.viz.core.drawables.ColorMapParameters; -import com.raytheon.uf.viz.core.drawables.IImage; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.drawables.SingleColorImage; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.gl.IGLTarget; -import com.raytheon.viz.core.gl.images.AbstractGLImage; -import com.raytheon.viz.core.gl.images.GLColormappedImage; - -/** - * Shader loader for rasters - * - *
- * 
- * SOFTWARE HISTORY
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * May 25, 2010            mschenke     Initial creation
- * 
- * 
- * - * @author mschenke - * @version 1.0 - */ - -public class GLSLRasterProgramLoader extends AbstractShaderLoader { - - /* - * (non-Javadoc - * - * @see - * com.raytheon.viz.core.gl.glsl.IShaderLoader#loadData(com.raytheon.viz - * .core.gl.IGLTarget, com.raytheon.viz.core.gl.glsl.GLShaderProgram, - * com.raytheon.uf.viz.core.drawables.IImage, - * com.raytheon.uf.viz.core.drawables.PaintProperties) - */ - @Override - public void loadData(IGLTarget target, GLShaderProgram program, - IImage iimage, PaintProperties paintProps) throws VizException { - // Check for single color image - if (iimage instanceof SingleColorImage) { - program.setUniform("doSingleColor", 1); - program.setUniform("singleColor", - ((SingleColorImage) iimage).getColor()); - iimage = ((SingleColorImage) iimage).getWrappedImage(); - } else { - program.setUniform("doSingleColor", 0); - } - - // Get image as AbstractGLImage - AbstractGLImage image = null; - if (iimage instanceof AbstractGLImage == false) { - throw new VizException( - "Cannot apply glsl raster shader to non gl image"); - } - image = (AbstractGLImage) iimage; - - program.setUniform("brightness", image.getBrightness()); - program.setUniform("contrast", image.getContrast()); - - int texId = image instanceof GLColormappedImage ? ((GLColormappedImage) image) - .getTextureid() : -1; - if (texId > -1) { - program.setUniform("doColorMap", 1); - } else { - program.setUniform("doColorMap", 0); - } - - float naturalMin = 0; - float naturalMax = 0; - - float cmapMin = 0; - float cmapMax = 0; - - if (texId > 0) { - GLColormappedImage colormappedImg = (GLColormappedImage) image; - ColorMapParameters colorMapParameters = colormappedImg - .getColorMapParameters(); - - naturalMin = colorMapParameters.getDataMin(); - naturalMax = colorMapParameters.getDataMax(); - cmapMin = colorMapParameters.getColorMapMin(); - cmapMax = colorMapParameters.getColorMapMax(); - - program.setUniform("colorMapSz", colorMapParameters.getColorMap() - .getSize()); - int textureType = ((GLColormappedImage) image).getTextureType(); - program.setUniform("isFloat", textureType == GL.GL_FLOAT - || textureType == GL.GL_HALF_FLOAT_ARB ? 1 : 0); - program.setUniform("logarithmic", - colorMapParameters.isLogarithmic() ? 1 : 0); - program.setUniform("logFactor", colorMapParameters.getLogFactor()); - program.setUniform("mirror", colorMapParameters.isMirror() ? 1 : 0); - - program.setUniform("applyMask", colorMapParameters.isUseMask() ? 1 - : 0); - } - - program.setUniform("naturalMin", naturalMin); - program.setUniform("naturalMax", naturalMax); - program.setUniform("cmapMin", cmapMin); - program.setUniform("cmapMax", cmapMax); - - program.setUniform("alphaMask", 2); - program.setUniform("colorMap", 1); - program.setUniform("rawText", 0); - - program.setUniform("alphaVal", paintProps.getAlpha()); - } -} diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/GLShaderProgram.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/GLShaderProgram.java index 9e70031e2d..7a4b7aae73 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/GLShaderProgram.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/GLShaderProgram.java @@ -21,7 +21,9 @@ package com.raytheon.viz.core.gl.glsl; import java.nio.ByteBuffer; import java.nio.IntBuffer; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.media.opengl.GL; @@ -31,8 +33,6 @@ import org.eclipse.swt.graphics.RGB; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.uf.viz.core.drawables.IImage; -import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.core.gl.IGLTarget; import com.raytheon.viz.core.gl.glsl.internal.GLProgramManager; @@ -68,14 +68,6 @@ public class GLShaderProgram { private int glslContext = -1; - private int vertexShaderId = -1; - - private int fragmentShaderId = -1; - - private IShaderLoader vertexShader; - - private IShaderLoader fragmentShader; - private State state = State.INVALID; // Declaring and using variables in GLSL is similar to using variables in C. @@ -111,28 +103,36 @@ public class GLShaderProgram { * @param fragmentShader * - can be null (but not if vertexShader == null) */ - GLShaderProgram(IGLTarget target, String name, IShaderLoader vertexShader, - IShaderLoader fragmentShader) throws VizException { + GLShaderProgram(IGLTarget target, String name, String vertexShader, + String fragmentShader) throws VizException { gl = target.getGl(); - glslContext = gl.glCreateProgramObjectARB(); + glslContext = gl.glCreateProgram(); if (glslContext < 1) { throw new VizException( "Error creating glsl program, could not create program object"); } - vertexShaderId = -1; - fragmentShaderId = -1; - + List shaderIds = new ArrayList(2); if (vertexShader != null) { - this.setVertexShader(vertexShader); + shaderIds.add(addShader(vertexShader, GL.GL_VERTEX_SHADER)); } if (fragmentShader != null) { - this.setFragmentShader(fragmentShader); + shaderIds.add(addShader(fragmentShader, GL.GL_FRAGMENT_SHADER)); } - gl.glLinkProgramARB(glslContext); + + for (Integer shaderId : shaderIds) { + gl.glAttachShader(glslContext, shaderId); + } + gl.glLinkProgram(glslContext); if (!checkForLinkingErrors(gl)) { state = State.INITIALIZED; + for (Integer shaderId : shaderIds) { + gl.glDeleteShader(shaderId); + } + } else { + throw new VizException( + "Error creating glsl shader program, could not link"); } this.name = name; } @@ -142,7 +142,7 @@ public class GLShaderProgram { */ public void startShader() { if (state == State.INITIALIZED) { - gl.glUseProgramObjectARB(glslContext); + gl.glUseProgram(glslContext); state = State.IN_USE; } loadedUniforms.clear(); @@ -153,7 +153,7 @@ public class GLShaderProgram { */ public void endShader() { if (state == State.IN_USE) { - gl.glUseProgramObjectARB(0); + gl.glUseProgram(0); state = State.INITIALIZED; } loadedUniforms.clear(); @@ -168,53 +168,18 @@ public class GLShaderProgram { } /** - * Load data into the shader program + * Load, and compile the shader program * - * @param target - * @param image - * @param paintProps - * @throws VizException + * @param shader */ - public void loadData(IGLTarget target, IImage image, - PaintProperties paintProps) throws VizException { - if (state == State.IN_USE) { - if (vertexShader != null) { - vertexShader.loadData(target, this, image, paintProps); - } - if (fragmentShader != null) { - fragmentShader.loadData(target, this, image, paintProps); - } - } - } - - /** - * Set, load, and compile the vertex shader program - * - * @param vshader - */ - private void setVertexShader(IShaderLoader vshader) throws VizException { - this.vertexShader = vshader; - vertexShaderId = loadShaderProgram(GLProgramManager.getInstance() - .getProgramCode(vshader.getName()), GL.GL_VERTEX_SHADER); - if (vertexShaderId < 0) { + private int addShader(String shaderName, int shaderType) + throws VizException { + int shaderId = loadShaderProgram(shaderName, shaderType); + if (shaderId < 1) { throw new VizException( - "Error creating vertex shader, object not allocated"); - } - } - - /** - * Set, load, and compile the fragment shader program - * - * @param fshader - */ - private void setFragmentShader(IShaderLoader fshader) throws VizException { - this.fragmentShader = fshader; - fragmentShaderId = loadShaderProgram(GLProgramManager.getInstance() - .getProgramCode(fshader.getName()), GL.GL_FRAGMENT_SHADER); - if (fragmentShaderId < 0) { - throw new VizException( - "Error creating fragment shader, object not allocated"); + "Error creating shader, object not allocated"); } + return shaderId; } /** @@ -224,54 +189,20 @@ public class GLShaderProgram { * @param glShaderId * @return the shader program id */ - private int loadShaderProgram(String program, int glShaderId) { - int shaderId = gl.glCreateShaderObjectARB(glShaderId); + private int loadShaderProgram(String programName, int glShaderId) + throws VizException { + String program = GLProgramManager.getInstance().getProgramCode( + programName); + int shaderId = gl.glCreateShader(glShaderId); if (shaderId >= 0) { - gl.glShaderSourceARB(shaderId, 1, new String[] { program }, + gl.glShaderSource(shaderId, 1, new String[] { program }, (int[]) null, 0); - gl.glCompileShaderARB(shaderId); - checkForCompileErrors(gl, shaderId, glShaderId); - gl.glAttachObjectARB(glslContext, shaderId); + gl.glCompileShader(shaderId); + checkForCompileErrors(gl, shaderId, glShaderId, programName); } return shaderId; } - /** - * Updates the fragment shader's loader object - * - * @param fshader - */ - public void updateFragmentShader(IShaderLoader fshader) { - this.fragmentShader = fshader; - } - - /** - * Update the vertex shader loader - * - * @param vshader - */ - public void updateVertexShader(IShaderLoader vshader) { - this.vertexShader = vshader; - } - - /** - * Get the shader loader - * - * @return - */ - IShaderLoader getVertexShader() { - return vertexShader; - } - - /** - * Get the fragment loader - * - * @return - */ - IShaderLoader getFragmentShader() { - return fragmentShader; - } - /** * Set the uniform variable for the shader program * @@ -283,6 +214,9 @@ public class GLShaderProgram { gl.glUniform1f(getUniformLocation(uniformName), (Float) value); } else if (value instanceof Integer) { gl.glUniform1i(getUniformLocation(uniformName), (Integer) value); + } else if (value instanceof Boolean) { + gl.glUniform1i(getUniformLocation(uniformName), + ((Boolean) value) == true ? 1 : 0); } else if (value instanceof int[]) { gl.glUniform1iv(getUniformLocation(uniformName), MAX_MULTIGRIDS, (int[]) value, 0); @@ -306,7 +240,7 @@ public class GLShaderProgram { * @param value */ public void setUniform(String key, Object value) { - if (value != null) { + if (value != null && state == State.IN_USE) { if (loadedUniforms.containsKey(key) == false || value.equals(loadedUniforms.get(key)) == false) { // we haven't loaded this uniform yet or it is different @@ -324,7 +258,7 @@ public class GLShaderProgram { * @return */ private int getUniformLocation(String name) { - return (gl.glGetUniformLocationARB(glslContext, name)); + return (gl.glGetUniformLocation(glslContext, name)); } /** @@ -334,23 +268,22 @@ public class GLShaderProgram { * @param shader * @return */ - private boolean checkForCompileErrors(GL gl, int shader, int glId) { + private boolean checkForCompileErrors(GL gl, int shader, int glId, + String name) { String type = "unknown"; - String fileName = "unkown"; if (glId == GL.GL_FRAGMENT_SHADER) { type = "fragment"; - fileName = fragmentShader.getName(); } else if (glId == GL.GL_VERTEX_SHADER) { type = "vertex"; - fileName = vertexShader.getName(); } + boolean rval = false; int[] compilecheck = new int[1]; gl.glGetObjectParameterivARB(shader, GL.GL_OBJECT_COMPILE_STATUS_ARB, compilecheck, 0); if (compilecheck[0] == GL.GL_FALSE) { System.err.println("A compilation error occured in the " + type - + " shader source file (" + fileName + ".glsl)"); + + " shader source file (" + name + ")"); IntBuffer iVal = BufferUtil.newIntBuffer(1); gl.glGetObjectParameterivARB(shader, @@ -367,8 +300,8 @@ public class GLShaderProgram { byte[] infoBytes = new byte[length - 1]; infoLog.get(infoBytes); statusHandler.handle(Priority.CRITICAL, "Problem occured during " - + type + " shader initialization of file " + fileName - + ".glsl: " + new String(infoBytes)); + + type + " shader initialization of " + name + ": " + + new String(infoBytes)); System.err.println(new String(infoBytes)); rval = true; } @@ -417,18 +350,6 @@ public class GLShaderProgram { endShader(); } if (state == State.INITIALIZED) { - if (fragmentShader != null) { - gl.glDetachShader(glslContext, fragmentShaderId); - gl.glDeleteShader(fragmentShaderId); - fragmentShaderId = -1; - } - - if (vertexShader != null) { - gl.glDetachShader(glslContext, vertexShaderId); - gl.glDeleteShader(vertexShaderId); - vertexShaderId = -1; - } - gl.glDeleteProgram(glslContext); glslContext = -1; } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/internal/GLProgramManager.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/internal/GLProgramManager.java index b0559aeac5..7b4c6d1389 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/internal/GLProgramManager.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/internal/GLProgramManager.java @@ -23,11 +23,18 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import com.raytheon.uf.common.localization.IPathManager; +import com.raytheon.uf.common.localization.LocalizationFile; import com.raytheon.uf.common.localization.PathManagerFactory; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.core.exception.VizException; /** @@ -43,16 +50,44 @@ import com.raytheon.uf.viz.core.exception.VizException; */ public class GLProgramManager { + private static final String GLSL_FOLDER = "glsl"; + + private static final String GLSL_INCLUDE_FOLDER = GLSL_FOLDER + + IPathManager.SEPARATOR + "include"; + + private static final String GLSL_EXTENSION = ".glsl"; + + private static final String GLSL_HEADER_EXTENSION = ".glh"; + + private static final Pattern INCLUDE_PATTERN = Pattern + .compile("^#include\\s*<([a-zA-z0-9_]*)>.*"); + private static GLProgramManager instance; + private final Map includeCode = new HashMap(); + private final Map programsCode = new HashMap(); - private Map fileMap = new HashMap(); + private final Map headerFiles = new HashMap(); - private Map modificationMap = new HashMap(); + private final Map includeFiles = new HashMap(); + + private final Map programFiles = new HashMap(); + + private final IPathManager pm; private GLProgramManager() { + pm = PathManagerFactory.getPathManager(); + // Lookup available main programs (will be in glsl directory) + LocalizationFile[] files = pm.listStaticFiles(GLSL_FOLDER, + new String[] { GLSL_EXTENSION }, false, true); + for (LocalizationFile file : files) { + File fileObj = file.getFile(); + String name = fileObj.getName(); + programFiles.put(name, fileObj); + programsCode.put(name, readProgramContents(fileObj)); + } } public static GLProgramManager getInstance() { @@ -63,67 +98,151 @@ public class GLProgramManager { return instance; } + /** + * Get program code for the program name specified, these files live in glsl + * directory in localization. + * + * @param aProgramName + * @return + * @throws VizException + */ public String getProgramCode(String aProgramName) throws VizException { - String program = programsCode.get(aProgramName); - String searchPath = "glsl" + File.separator + aProgramName + ".glsl"; - if (hasBeenModified(searchPath, true) || program == null) { - File file = fileMap.get(searchPath); - modificationMap.put(file, file.lastModified()); - try { - program = readFile(file); - programsCode.put(aProgramName, program); - } catch (IOException e) { - throw new VizException("Error loading program code for: " - + aProgramName, e); - } - } - - return program; + String fileName = aProgramName + GLSL_EXTENSION; + hasBeenModified(aProgramName); + return programsCode.get(fileName); } - public boolean hasBeenModified(String searchPath, boolean path) { - if (searchPath == null) { - return false; - } - - if (!path) { - searchPath = "glsl" + File.separator + searchPath + ".glsl"; - } - - File file = fileMap.get(searchPath); - if (file == null) { - IPathManager pm = PathManagerFactory.getPathManager(); - file = pm.getStaticFile(searchPath); - fileMap.put(searchPath, file); - } - - if (file.exists() == false) { - return false; - } - - Long lastMod = modificationMap.get(file); - if (lastMod == null || file.lastModified() > lastMod) { - return true; - } + /** + * Checks if program has been modified + * + * @param programName + * @return + */ + public boolean hasBeenModified(String programName) { + // TODO: Check file modification time and reload contents. Should also + // check modification times of files depends on and reload if any + // changes return false; } - private String readFile(File aFile) throws IOException { + /** + * Reads program contends for file, will recursively load all #includes as + * well + * + * @param aFile + * @return + */ + private String readProgramContents(File aFile) { + try { + StringBuffer buffer = new StringBuffer(); + + List toInclude = new ArrayList(); + getIncludes(aFile, toInclude); + + for (String include : toInclude) { + // look for header file first + File header = getIncludeFile(include, true); + if (header != null) { + String name = header.getName(); + String contents = includeCode.get(name); + if (contents == null) { + contents = readFileContents(header); + includeCode.put(name, contents); + } + buffer.append(contents); + } + } + + for (String include : toInclude) { + // look for glsl files next + File header = getIncludeFile(include, false); + if (header != null) { + String name = header.getName(); + String contents = includeCode.get(name); + if (contents == null) { + contents = readFileContents(header); + includeCode.put(name, contents); + } + buffer.append(contents); + } + } + + // Read program file contents + buffer.append(readFileContents(aFile)); + return buffer.toString(); + } catch (IOException e) { + UFStatus.getHandler().handle(Priority.PROBLEM, + "Error reading glsl program code from file system", e); + } + return null; + } + + /** + * Read file contents off file system + * + * @param file + * @param includeCode + * @return + * @throws IOException + */ + private String readFileContents(File file) throws IOException { StringBuffer buffer = new StringBuffer(); - FileReader fr = new FileReader(aFile); - BufferedReader reader = new BufferedReader(fr); - String line = ""; - while (line != null) { - buffer.append(line); - buffer.append("\n"); - line = reader.readLine(); + BufferedReader reader = new BufferedReader(new FileReader(file)); + + String line = null; + while ((line = reader.readLine()) != null) { + Matcher match = INCLUDE_PATTERN.matcher(line); + if (match.find() == false) { + buffer.append(line).append("\n"); + } + } + + return buffer.toString(); + } + + private void getIncludes(File file, List toInclude) + throws IOException { + List newIncludes = new ArrayList(); + BufferedReader reader = new BufferedReader(new FileReader(file)); + String line = null; + while ((line = reader.readLine()) != null) { + Matcher match = INCLUDE_PATTERN.matcher(line); + if (match.find()) { + String include = match.group(1); + if (toInclude.contains(include) == false + && newIncludes.contains(include) == false) { + newIncludes.add(include); + toInclude.add(include); + } + } } reader.close(); - fr.close(); - String text = buffer.toString(); - return text; + // Recursively get all include files + for (String newInclude : newIncludes) { + getIncludes(getIncludeFile(newInclude, false), toInclude); + } } + private File getIncludeFile(String name, boolean header) { + String fileName = name + + (header ? GLSL_HEADER_EXTENSION : GLSL_EXTENSION); + + Map toUse = null; + if (header) { + toUse = headerFiles; + } else { + toUse = includeFiles; + } + + File file = toUse.get(name); + if (file == null) { + file = pm.getStaticFile(GLSL_INCLUDE_FOLDER + + IPathManager.SEPARATOR + fileName); + toUse.put(name, file); + } + + return file; + } } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLImage.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLImage.java index c27bf3f573..90ef3270f8 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLImage.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLImage.java @@ -24,10 +24,12 @@ import javax.media.opengl.glu.GLU; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.core.gl.GLContextBridge; import com.raytheon.viz.core.gl.objects.GLFrameBufferObject; import com.raytheon.viz.core.gl.objects.GLRenderBuffer; +import com.sun.opengl.util.texture.TextureCoords; /** * @@ -69,7 +71,10 @@ public abstract class AbstractGLImage implements IImage { // Used for offscreen rendering private GLRenderBuffer rbuf; - protected AbstractGLImage() { + private Class extensionClass; + + protected AbstractGLImage(Class extensionClass) { + this.extensionClass = extensionClass; } /** @@ -214,14 +219,75 @@ public abstract class AbstractGLImage implements IImage { rbuf = null; } throw new VizException(errorMessage); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#getExtensionClass() + */ + @Override + public Class getExtensionClass() { + return extensionClass; + } + + /** + * Binds the texture. Default implementation takes the textureId and binds + * to GL_TEXTURE0. Use bind(int) for more control + * + * @return + */ + public boolean bind(GL gl) { + return bind(gl, GL.GL_TEXTURE0); + } + + public boolean bind(GL gl, int texture) { + int texId = getTextureid(); + if (texId > 0) { + int textureType = getTextureStorageType(); + gl.glActiveTexture(texture); + gl.glBindTexture(textureType, texId); + + // Apply interpolation + if (isInterpolated()) { + gl.glTexParameteri(textureType, GL.GL_TEXTURE_MIN_FILTER, + GL.GL_LINEAR); + gl.glTexParameteri(textureType, GL.GL_TEXTURE_MAG_FILTER, + GL.GL_LINEAR); + } else { + gl.glTexParameteri(textureType, GL.GL_TEXTURE_MIN_FILTER, + GL.GL_NEAREST); + gl.glTexParameteri(textureType, GL.GL_TEXTURE_MAG_FILTER, + GL.GL_NEAREST); + } + return true; + return false; + } + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#stage() + */ + @Override + public final void stage() throws VizException { + Status status = getStatus(); + if (status != Status.LOADED && status != Status.STAGED) { + setStatus(Status.LOADING); + if (stageTexture()) { + setStatus(Status.STAGED); + } else { + setStatus(Status.FAILED); + } } } + public abstract TextureCoords getTextureCoords(); + public abstract int getTextureid(); public abstract int getTextureStorageType(); - public abstract void stageTexture() throws VizException; + public abstract boolean stageTexture() throws VizException; public abstract void loadTexture(GL gl) throws VizException; diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLCMTextureData.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLCMTextureData.java index e7ff4519c9..79cdadb29d 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLCMTextureData.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLCMTextureData.java @@ -200,7 +200,7 @@ public class GLCMTextureData implements IImageCacheable { return GL.GL_TEXTURE_2D; } - public double getValue(int x, int y, float dataMin, float dataMax) { + public double getValue(int x, int y) { if (!isStaged() && isLoaded()) { GL gl = GLU.getCurrentGL(); if (gl == null || data == null) { diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLColormappedImage.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLColormappedImage.java index 28c59d934a..fdc594669b 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLColormappedImage.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLColormappedImage.java @@ -24,8 +24,9 @@ import javax.media.opengl.GL; import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.IColormappedImage; +import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.gl.IGLTarget; +import com.sun.opengl.util.texture.TextureCoords; /** * @@ -51,24 +52,30 @@ public class GLColormappedImage extends AbstractGLImage implements protected GLCMTextureData data; public GLColormappedImage(IColorMapDataRetrievalCallback dataCallback, - ColorMapParameters params, IGLTarget target) { - super(); + ColorMapParameters params, + Class extensionClass) { + super(extensionClass); this.data = GLCMTextureData.getGlTextureId(dataCallback); this.colorMapParameters = params; + if (data.isLoaded()) { + setStatus(Status.LOADED); + } else if (data.isStaged()) { + setStatus(Status.STAGED); + } } /* * (non-Javadoc) * - * @see com.raytheon.viz.core.gl.GLImage#stageTexture() + * @see com.raytheon.viz.core.gl.images.AbstractGLImage#stageTexture() */ @Override - public void stageTexture() throws VizException { - if (data.stageTexture()) { - setStatus(Status.STAGED); - } else { - setStatus(Status.FAILED); + public boolean stageTexture() throws VizException { + if (data == null) { + throw new VizException( + "Cannot stage texture, image has been disposed"); } + return data.stageTexture(); } /* @@ -169,8 +176,10 @@ public class GLColormappedImage extends AbstractGLImage implements @Override public double getValue(int x, int y) { - double val = data.getValue(x, y, colorMapParameters.getDataMin(), - colorMapParameters.getDataMax()); + double val = Double.NaN; + if (data != null) { + val = data.getValue(x, y); + } return val; } @@ -222,7 +231,11 @@ public class GLColormappedImage extends AbstractGLImage implements @Override public Status getStatus() { Status status = super.getStatus(); - if (data.isLoaded()) { + if (data == null) { + if (status != Status.UNLOADED) { + setStatus(Status.UNLOADED); + } + } else if (data.isLoaded()) { if (status != Status.LOADED) { setStatus(Status.LOADED); } @@ -242,4 +255,14 @@ public class GLColormappedImage extends AbstractGLImage implements return super.getStatus(); } + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.AbstractGLImage#getTextureCoords() + */ + @Override + public TextureCoords getTextureCoords() { + return new TextureCoords(0, 1, 1, 0); + } + } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLDelegateImage.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLDelegateImage.java new file mode 100644 index 0000000000..dfd6a56c41 --- /dev/null +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLDelegateImage.java @@ -0,0 +1,176 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.viz.core.gl.images; + +import javax.media.opengl.GL; + +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; +import com.raytheon.uf.viz.core.exception.VizException; +import com.sun.opengl.util.texture.TextureCoords; + +/** + * GL image that wraps another gl image + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Dec 16, 2011            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class GLDelegateImage extends AbstractGLImage { + + protected T image; + + public GLDelegateImage(T image, + Class extensionClass) { + super(extensionClass); + this.image = image; + } + + public T getWrappedImage() { + return image; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#getWidth() + */ + @Override + public int getWidth() { + return image.getWidth(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IImage#getHeight() + */ + @Override + public int getHeight() { + return image.getHeight(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.AbstractGLImage#getTextureCoords() + */ + @Override + public TextureCoords getTextureCoords() { + return image.getTextureCoords(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.AbstractGLImage#getTextureid() + */ + @Override + public int getTextureid() { + return image.getTextureid(); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.images.AbstractGLImage#getTextureStorageType () + */ + @Override + public int getTextureStorageType() { + return image.getTextureStorageType(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.AbstractGLImage#stageTexture() + */ + @Override + public boolean stageTexture() throws VizException { + return image.stageTexture(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.AbstractGLImage#loadTexture(javax + * .media.opengl.GLContext) + */ + @Override + public void loadTexture(GL gl) throws VizException { + image.loadTexture(gl); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.images.AbstractGLImage#target(com.raytheon.uf + * .viz.core.IGraphicsTarget) + */ + @Override + public void target(IGraphicsTarget target) throws VizException { + image.target(target); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.AbstractGLImage#getStatus() + */ + @Override + public Status getStatus() { + return image.getStatus(); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.images.AbstractGLImage#setStatus(com.raytheon + * .uf.viz.core.drawables.IImage.Status) + */ + @Override + public void setStatus(Status status) { + image.setStatus(status); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.AbstractGLImage#usaAsFrameBuffer() + */ + @Override + public void usaAsFrameBuffer() throws VizException { + image.usaAsFrameBuffer(); + } + +} diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImage.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImage.java index df5d54e09c..28d71155c4 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImage.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImage.java @@ -30,17 +30,18 @@ import javax.media.jai.PlanarImage; import javax.media.opengl.GL; import com.raytheon.uf.viz.core.data.IRenderedImageCallback; +import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.gl.IGLTarget; import com.raytheon.viz.core.gl.internal.cache.IImageCacheable; import com.raytheon.viz.core.gl.internal.cache.ImageCache; import com.raytheon.viz.core.gl.internal.cache.ImageCache.CacheType; import com.sun.opengl.util.texture.Texture; +import com.sun.opengl.util.texture.TextureCoords; import com.sun.opengl.util.texture.TextureData; import com.sun.opengl.util.texture.TextureIO; /** - * Represents a GL "Image" + * Represents a GL "RenderedImage" * *
  * 
@@ -70,8 +71,8 @@ public class GLImage extends AbstractGLImage implements IImageCacheable {
 
     protected int size;
 
-    public GLImage(IRenderedImageCallback preparer, IGLTarget target) {
-        super();
+    public GLImage(IRenderedImageCallback preparer, Class extensionClass) {
+        super(extensionClass);
         theTexture = null;
         this.imagePreparer = preparer;
     }
@@ -125,17 +126,20 @@ public class GLImage extends AbstractGLImage implements IImageCacheable {
 
     }
 
-    /**
-     * Stage the texture in memory
+    /*
+     * (non-Javadoc)
      * 
-     * The texture will then be ready to load into the video card
-     * 
-     * @throws VizException
+     * @see com.raytheon.viz.core.gl.images.AbstractGLImage#stageTexture()
      */
-    public void stageTexture() throws VizException {
-        generateTextureData();
-        ImageCache.getInstance(CacheType.MEMORY).put(this); // Add to
-        // memory
+    @Override
+    public boolean stageTexture() throws VizException {
+        if (theImage == null) {
+            theImage = imagePreparer.getImage();
+        }
+        boolean rval = generateTextureData(theImage);
+        // Add to memory cache
+        ImageCache.getInstance(CacheType.MEMORY).put(this);
+        return rval;
     }
 
     /**
@@ -177,9 +181,9 @@ public class GLImage extends AbstractGLImage implements IImageCacheable {
      * @param rendImg
      *            the rendered image to load
      */
-    private void generateTextureData(RenderedImage rendImg) {
+    private boolean generateTextureData(RenderedImage rendImg) {
         if (rendImg == null) {
-            return;
+            return false;
         }
 
         if (rendImg instanceof BufferedImage) {
@@ -196,18 +200,7 @@ public class GLImage extends AbstractGLImage implements IImageCacheable {
 
         this.size = rendImg.getHeight() * rendImg.getWidth() * 4
                 * rendImg.getColorModel().getNumColorComponents();
-        setStatus(Status.STAGED);
-    }
-
-    private void generateTextureData() {
-        if (theImage == null) {
-            try {
-                theImage = imagePreparer.getImage();
-            } catch (VizException e) {
-                e.printStackTrace();
-            }
-        }
-        generateTextureData(theImage);
+        return true;
     }
 
     /**
@@ -250,6 +243,9 @@ public class GLImage extends AbstractGLImage implements IImageCacheable {
      * @see com.raytheon.viz.core.drawables.IImage#getHeight()
      */
     public int getHeight() {
+        if (theImage != null) {
+            return theImage.getHeight();
+        }
         if (theTexture != null) {
             return theTexture.getImageHeight();
         }
@@ -263,6 +259,9 @@ public class GLImage extends AbstractGLImage implements IImageCacheable {
      * @see com.raytheon.viz.core.drawables.IImage#getWidth()
      */
     public int getWidth() {
+        if (theImage != null) {
+            return theImage.getWidth();
+        }
         if (theTexture != null) {
             return theTexture.getImageWidth();
         }
@@ -305,4 +304,14 @@ public class GLImage extends AbstractGLImage implements IImageCacheable {
         return getTexture().getTextureObject();
     }
 
+    /*
+     * (non-Javadoc)
+     * 
+     * @see com.raytheon.viz.core.gl.images.AbstractGLImage#getTextureCoords()
+     */
+    @Override
+    public TextureCoords getTextureCoords() {
+        return theTexture.getImageTexCoords();
+    }
+
 }
diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLSingleColorImage.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLSingleColorImage.java
new file mode 100644
index 0000000000..ce8361b49d
--- /dev/null
+++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLSingleColorImage.java
@@ -0,0 +1,70 @@
+/**
+ * This software was developed and / or modified by Raytheon Company,
+ * pursuant to Contract DG133W-05-CQ-1067 with the US Government.
+ * 
+ * U.S. EXPORT CONTROLLED TECHNICAL DATA
+ * This software product contains export-restricted data whose
+ * export/transfer/disclosure is restricted by U.S. law. Dissemination
+ * to non-U.S. persons whether in the United States or abroad requires
+ * an export license or other authorization.
+ * 
+ * Contractor Name:        Raytheon Company
+ * Contractor Address:     6825 Pine Street, Suite 340
+ *                         Mail Stop B8
+ *                         Omaha, NE 68106
+ *                         402.291.0100
+ * 
+ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for
+ * further licensing information.
+ **/
+package com.raytheon.viz.core.gl.images;
+
+import org.eclipse.swt.graphics.RGB;
+
+import com.raytheon.uf.viz.core.drawables.ext.ISingleColorImageExtension.ISingleColorImage;
+import com.raytheon.viz.core.gl.internal.ext.GLSingleColorImageExtension;
+
+/**
+ * GL Image object that all non-zero values should be mapped to a single color
+ * value
+ * 
+ * 
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Dec 15, 2011            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class GLSingleColorImage extends GLDelegateImage + implements ISingleColorImage { + + private RGB color; + + public GLSingleColorImage(AbstractGLImage image, RGB color) { + super(image, GLSingleColorImageExtension.class); + this.color = color; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.ext.ISingleColorImageExtension + * .ISingleColorImage#setColor(org.eclipse.swt.graphics.RGB) + */ + @Override + public void setColor(RGB color) { + this.color = color; + } + + public RGB getColor() { + return color; + } + +} \ No newline at end of file diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLMesh2DStrips.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLMesh2DStrips.java index 0cd09510f8..fab333c4bf 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLMesh2DStrips.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLMesh2DStrips.java @@ -21,17 +21,17 @@ package com.raytheon.viz.core.gl.internal; import javax.media.opengl.GL; +import org.geotools.coverage.grid.GeneralGridGeometry; +import org.geotools.coverage.grid.GridGeometry2D; +import org.geotools.geometry.jts.ReferencedEnvelope; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.TransformException; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.uf.viz.core.map.IMapDescriptor; -import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; +import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.core.gl.AbstractGLMesh; +import com.raytheon.viz.core.gl.Activator; import com.raytheon.viz.core.gl.SharedCoordMap.SharedCoordinateKey; -import com.vividsolutions.jts.geom.Envelope; /** * @@ -51,11 +51,10 @@ import com.vividsolutions.jts.geom.Envelope; */ public class GLMesh2DStrips extends AbstractGLMesh { - private static final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(GLMesh2DStrips.class); - - public GLMesh2DStrips(IMapDescriptor descriptor) { - super(GL.GL_TRIANGLE_STRIP, descriptor); + public GLMesh2DStrips(GridGeometry2D imageGeometry, + GeneralGridGeometry targetGeometry) throws VizException { + super(GL.GL_TRIANGLE_STRIP); + initialize(imageGeometry, targetGeometry); } /* @@ -67,19 +66,21 @@ public class GLMesh2DStrips extends AbstractGLMesh { * org.opengis.referencing.operation.MathTransform) */ @Override - public double[][][] generateWorldCoords(ImageTile tile, MathTransform mt) - throws TransformException { - double worldMinX = tile.envelope.getMinX(); - double worldMinY = tile.envelope.getMinY(); - double worldWidth = tile.envelope.getWidth(); - double worldHeight = tile.envelope.getHeight(); + public double[][][] generateWorldCoords(GridGeometry2D imageGeometry, + MathTransform mt) throws TransformException { + ReferencedEnvelope envelope = new ReferencedEnvelope( + imageGeometry.getEnvelope()); + double worldMinX = envelope.getMinX(); + double worldMinY = envelope.getMinY(); + double worldWidth = envelope.getWidth(); + double worldHeight = envelope.getHeight(); // get dx and dy for texture points double dXWorld = worldWidth / (key.horizontalDivisions); - double dYWorld = worldHeight / (key.verticalDivisions - 1); + double dYWorld = worldHeight / (key.verticalDivisions); - double[][][] worldCoordinates = new double[key.horizontalDivisions][2 * key.verticalDivisions][2]; + double[][][] worldCoordinates = new double[key.horizontalDivisions][2 * (key.verticalDivisions + 1)][2]; int width = worldCoordinates.length; int height = worldCoordinates[0].length; @@ -136,68 +137,74 @@ public class GLMesh2DStrips extends AbstractGLMesh { return worldCoordinates; } + private static final int MIN_HORZ_DIVS = 1; + + private static final int MIN_VERT_DIVS = 1; + @Override - protected SharedCoordinateKey generateKey(ImageTile tile, MathTransform mt) { + protected SharedCoordinateKey generateKey(GridGeometry2D imageGeometry, + MathTransform mt) { + int width = imageGeometry.getGridRange().getSpan(0); + int height = imageGeometry.getGridRange().getSpan(1); try { - int maxHorzDiv = tile.rect.width / 4; - int maxVertDiv = tile.rect.height / 4; - Envelope envelope = tile.envelope; + int maxHorzDiv = Math.max(width / 4, MIN_HORZ_DIVS); + int maxVertDiv = Math.max(height / 4, MIN_VERT_DIVS); + + ReferencedEnvelope envelope = new ReferencedEnvelope( + imageGeometry.getEnvelope()); double[] tl = { envelope.getMinX(), envelope.getMaxY() }; double[] tr = { envelope.getMaxX(), envelope.getMaxY() }; double[] bl = { envelope.getMinX(), envelope.getMinY() }; double[] br = { envelope.getMaxX(), envelope.getMinY() }; - // start off estimating the number of horzintal divisions by using - // only the top and bottom. - int horzDivTop = 1 + getNumDivisions(tl, null, tr, null, - maxHorzDiv, mt); - int horzDivBot = 1 + getNumDivisions(bl, null, br, null, - maxHorzDiv, mt); - int horzDiv = Math.max(horzDivTop, horzDivBot); + + int horzDiv = MIN_HORZ_DIVS; + if (maxHorzDiv > MIN_HORZ_DIVS) { + // start off estimating the number of horzintal divisions by + // using only the top and bottom. + int horzDivTop = getNumDivisions(tl, null, tr, null, + maxHorzDiv, mt); + int horzDivBot = getNumDivisions(bl, null, br, null, + maxHorzDiv, mt); + horzDiv = Math.max(horzDivTop, horzDivBot); + } // Next get the number of vertical divisions by finding the maximum // needed in every horizontal row. - int vertDiv = 2; - for (int i = 1; i <= horzDiv; i++) { - double topX = tl[0] + (tr[0] - tl[0]) * i / horzDiv; - double topY = tl[1] + (tr[1] - tl[1]) * i / horzDiv; - double botX = bl[0] + (br[0] - bl[0]) * i / horzDiv; - double botY = bl[1] + (br[1] - bl[1]) * i / horzDiv; - double[] top = { topX, topY }; - double[] bot = { botX, botY }; - int vertDivTest = 1 + getNumDivisions(top, null, bot, null, - maxVertDiv, mt); - vertDiv = Math.max(vertDiv, vertDivTest); - if (vertDiv >= maxVertDiv) { - vertDiv = maxVertDiv; - break; + int vertDiv = MIN_VERT_DIVS; + if (maxVertDiv > MIN_VERT_DIVS) { + for (int i = 1; i <= horzDiv; i++) { + double topX = tl[0] + (tr[0] - tl[0]) * i / horzDiv; + double topY = tl[1] + (tr[1] - tl[1]) * i / horzDiv; + double botX = bl[0] + (br[0] - bl[0]) * i / horzDiv; + double botY = bl[1] + (br[1] - bl[1]) * i / horzDiv; + double[] top = { topX, topY }; + double[] bot = { botX, botY }; + int vertDivTest = getNumDivisions(top, null, bot, null, + maxVertDiv, mt); + vertDiv = Math.max(vertDiv, vertDivTest); } } + // Now fill in the actual number of horzontal divisions incase // distortion increases towards the middle. - for (int i = 2; i < vertDiv; i++) { + for (int i = MIN_VERT_DIVS; i < vertDiv; i++) { double leftX = bl[0] + (tl[0] - bl[0]) * i / vertDiv; double leftY = bl[1] + (tl[1] - bl[1]) * i / vertDiv; double rightX = br[0] + (tr[0] - br[0]) * i / vertDiv; double rightY = br[1] + (tr[1] - br[1]) * i / vertDiv; double[] left = { leftX, leftY }; double[] right = { rightX, rightY }; - int horzDivTest = 1 + getNumDivisions(left, null, right, null, + int horzDivTest = getNumDivisions(left, null, right, null, maxHorzDiv, mt); horzDiv = Math.max(horzDiv, horzDivTest); - if (horzDiv >= maxHorzDiv) { - horzDiv = maxHorzDiv; - break; - } } - horzDiv = Math.max(2, horzDiv); - vertDiv = Math.max(2, vertDiv); + return new SharedCoordinateKey(vertDiv, horzDiv); } catch (Exception e) { - statusHandler + Activator.statusHandler .handle(Priority.PROBLEM, "Error calculating divisions needed for image, defaulting to dims/4", e); - return new SharedCoordinateKey(tile.rect.height / 4, - tile.rect.width / 4); + return new SharedCoordinateKey(height / 4, width / 4); } } @@ -210,12 +217,12 @@ public class GLMesh2DStrips extends AbstractGLMesh { if (r1 == null) { r1 = new double[p1.length]; mt.transform(p1, 0, r1, 0, 1); - r1 = descriptor.worldToPixel(r1); + r1 = worldToPixel(r1); } if (r3 == null) { r3 = new double[p3.length]; mt.transform(p3, 0, r3, 0, 1); - r3 = descriptor.worldToPixel(r3); + r3 = worldToPixel(r3); } if (r1 == null || r3 == null) { // if the image has some points outside the valid range of the @@ -226,7 +233,7 @@ public class GLMesh2DStrips extends AbstractGLMesh { double[] p2 = { (p1[0] + p3[0]) / 2, (p1[1] + p3[1]) / 2 }; double[] r2 = new double[p2.length]; mt.transform(p2, 0, r2, 0, 1); - r2 = descriptor.worldToPixel(r2); + r2 = worldToPixel(r2); double[] interp2 = { (r1[0] + r3[0]) / 2, (r1[1] + r3[1]) / 2 }; double dX = r2[0] - interp2[0]; double dY = r2[1] - interp2[1]; diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLTarget.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLTarget.java index ee12b3121a..508750107a 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLTarget.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLTarget.java @@ -32,7 +32,6 @@ import java.nio.IntBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -68,21 +67,16 @@ import com.raytheon.uf.viz.core.DrawableLine; import com.raytheon.uf.viz.core.DrawableString; import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.IMesh; import com.raytheon.uf.viz.core.PixelCoverage; -import com.raytheon.uf.viz.core.PixelExtent; import com.raytheon.uf.viz.core.VizConstants; import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; import com.raytheon.uf.viz.core.data.IColormappedDataPreparer; import com.raytheon.uf.viz.core.data.IDataPreparer; import com.raytheon.uf.viz.core.data.IImageDataPreparer; import com.raytheon.uf.viz.core.data.IRenderedImageCallback; -import com.raytheon.uf.viz.core.data.prep.CMDataPreparerManager; import com.raytheon.uf.viz.core.data.resp.NumericImageData; import com.raytheon.uf.viz.core.drawables.ColorMapLoader; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; -import com.raytheon.uf.viz.core.drawables.ColorMapParameters.LabelEntry; -import com.raytheon.uf.viz.core.drawables.IColormappedImage; import com.raytheon.uf.viz.core.drawables.IDescriptor; import com.raytheon.uf.viz.core.drawables.IFont; import com.raytheon.uf.viz.core.drawables.IFont.Style; @@ -90,9 +84,11 @@ import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.drawables.IRenderableDisplay; import com.raytheon.uf.viz.core.drawables.IShadedShape; import com.raytheon.uf.viz.core.drawables.IWireframeShape; +import com.raytheon.uf.viz.core.drawables.ImagingSupport; import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.drawables.SingleColorImage; +import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface; import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtensionManager; +import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; import com.raytheon.uf.viz.core.drawables.ext.IOffscreenRenderingExtension; import com.raytheon.uf.viz.core.drawables.ext.colormap.IColormappedImageExtension; import com.raytheon.uf.viz.core.exception.VizException; @@ -102,18 +98,15 @@ import com.raytheon.viz.core.gl.GLContextBridge; import com.raytheon.viz.core.gl.GLDisposalManager; import com.raytheon.viz.core.gl.IGLFont; import com.raytheon.viz.core.gl.IGLTarget; -import com.raytheon.viz.core.gl.TextureLoaderJob; -import com.raytheon.viz.core.gl.glsl.AbstractShaderLoader; import com.raytheon.viz.core.gl.glsl.GLSLFactory; import com.raytheon.viz.core.gl.glsl.GLShaderProgram; -import com.raytheon.viz.core.gl.images.AbstractGLImage; import com.raytheon.viz.core.gl.images.GLColormappedImage; import com.raytheon.viz.core.gl.images.GLImage; +import com.raytheon.viz.core.gl.internal.ext.GLColormappedImageExtension; +import com.raytheon.viz.core.gl.internal.ext.GLDefaultImagingExtension; import com.raytheon.viz.core.gl.objects.GLTextureObject; import com.sun.opengl.util.Screenshot; import com.sun.opengl.util.j2d.TextRenderer; -import com.sun.opengl.util.texture.Texture; -import com.sun.opengl.util.texture.TextureCoords; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.LinearRing; @@ -169,8 +162,6 @@ public class GLTarget implements IGLTarget { protected static final int maxColorMapCacheSize = com.raytheon.viz.core.gl.Activator .getDefault().getPreferenceStore().getInt("colorMapCacheSize"); - protected static GLTarget currentGl; - /** The gl context */ protected final GL gl; @@ -206,9 +197,6 @@ public class GLTarget implements IGLTarget { /** The current Zoom level */ protected double theCurrentZoom; - /** Display a built-in colorbar when displaying colormapped images */ - protected boolean useBuiltinColorbar = false; - /** The GLU object */ protected final GLU glu = new GLU(); @@ -254,10 +242,6 @@ public class GLTarget implements IGLTarget { protected final float textMagnification; - protected ColorMapParameters lastColormapUsed; - - protected double lastAlphaUsed = 1.0f; - protected final RGB DEFAULT_LABEL_COLOR = new RGB(255, 255, 255); protected Listener canvasResizeListener; @@ -351,7 +335,6 @@ public class GLTarget implements IGLTarget { public GLTarget(float width, float height) throws VizException { theCanvas = null; canvasSize = new Rectangle(0, 0, (int) width, (int) height); - theContext = new GLContextBridge((int) width, (int) height); theContext.makeContextCurrent(); @@ -423,7 +406,6 @@ public class GLTarget implements IGLTarget { display.setup(this); hasLoadedTextureOnLoop = false; - lastColormapUsed = null; synchronized (this) { if (refreshCount > 0) { refreshCount--; @@ -513,7 +495,7 @@ public class GLTarget implements IGLTarget { @Override public IWireframeShape createWireframeShape(boolean mutable, IDescriptor descriptor) { - return new GLWireframeShape2D(descriptor, mutable); + return new GLWireframeShape2D(descriptor.getGridGeometry(), mutable); } /* @@ -529,7 +511,7 @@ public class GLTarget implements IGLTarget { return new GLWireframeShape(descriptor, mutable, simplificationLevel); } else { - return new GLWireframeShape2D(descriptor, mutable); + return new GLWireframeShape2D(descriptor.getGridGeometry(), mutable); } } @@ -548,7 +530,7 @@ public class GLTarget implements IGLTarget { return new GLWireframeShape(descriptor, null, mutable, simplificationLevel, spatialChopFlag, extent); } else { - return new GLWireframeShape2D(descriptor, mutable); + return new GLWireframeShape2D(descriptor.getGridGeometry(), mutable); } } @@ -573,7 +555,6 @@ public class GLTarget implements IGLTarget { theCanvas.removeListener(SWT.Resize, this.canvasResizeListener); } - lastColormapUsed = null; extensionManager.dispose(); } @@ -634,47 +615,6 @@ public class GLTarget implements IGLTarget { drawCircle(circle); } - protected void drawColorbar(ColorMapParameters colorMapParameters) - throws VizException { - if (GLTarget.loadedColorMaps == null) { - return; - } - - this.clearClippingPlane(); - this.pushGLState(); - try { - - double x1 = this.viewExtent.getMinX(); - double x2 = x1 + ((this.viewExtent.getMaxX() - x1) / 2.0); - double y1 = this.viewExtent.getMinY(); - double y2 = y1 + ((x2 - x1) / 20.0); - - PixelExtent pixelExtent = new PixelExtent(x1, x2, y1, y2); - this.drawColorRamp(colorMapParameters.getColorMap(), pixelExtent, - (float) this.lastAlphaUsed); - - double yPos = y1 + (y2 - y1) / 2.0; - double zPos = 0; // draw the colorbar on the plane z = 0 - - List labels = colorMapParameters.getLabels(); - if (labels != null) { - for (LabelEntry label : labels) { - double xPos = x1 + ((x2 - x1) * label.getLocation()); - - String s = label.getText(); - - this.drawString(this.colorbarFont, s, xPos, yPos, zPos, - TextStyle.BLANKED, DEFAULT_LABEL_COLOR, - IGraphicsTarget.HorizontalAlignment.CENTER, - IGraphicsTarget.VerticalAlignment.MIDDLE, null); - } - } - - } finally { - this.popGLState(); - } - } - /* * (non-Javadoc) * @@ -700,13 +640,13 @@ public class GLTarget implements IGLTarget { throws VizException { this.pushGLState(); try { - final ColorMapParameters colorMapParams = drawableColorMap + ColorMapParameters colorMapParams = drawableColorMap .getColorMapParams(); IExtent pixelExtent = drawableColorMap.extent; - final float blendAlpha = drawableColorMap.alpha; - final float brightness = drawableColorMap.brightness; - final float contrast = drawableColorMap.contrast; - final float logFactor = drawableColorMap.getColorMapParams() + float blendAlpha = drawableColorMap.alpha; + float brightness = drawableColorMap.brightness; + float contrast = drawableColorMap.contrast; + float logFactor = drawableColorMap.getColorMapParams() .getLogFactor(); double x1 = pixelExtent.getMinX(); @@ -718,12 +658,19 @@ public class GLTarget implements IGLTarget { GLColormappedImage alphaMaskTexture = null; if (colorMapParams.isUseMask() && capabilities.cardSupportsShaders) { - byte[] mask = colorMapParams.getAlphaMask(); - alphaMaskTexture = (GLColormappedImage) initializeRaster( - CMDataPreparerManager.getDataPreparer(mask, - new java.awt.Rectangle(0, 0, mask.length, 1), - new int[] { mask.length, 1 }), colorMapParams); - alphaMaskTexture.stageTexture(); + final byte[] mask = colorMapParams.getAlphaMask(); + alphaMaskTexture = getExtension( + GLColormappedImageExtension.class).initializeRaster( + new IColorMapDataRetrievalCallback() { + @Override + public ColorMapData getColorMapData() + throws VizException { + return new ColorMapData(ByteBuffer.wrap(mask), + new int[] { mask.length, 1 }); + } + + }, colorMapParams); + alphaMaskTexture.stage(); alphaMaskTexture.target(this); } @@ -761,36 +708,24 @@ public class GLTarget implements IGLTarget { GLShaderProgram program = null; if (capabilities.cardSupportsShaders) { - synchronized (GLSLFactory.class) { - GLSLFactory.registerProgramLoader("colormap", - new AbstractShaderLoader() { - @Override - public void loadData(IGLTarget target, - GLShaderProgram program, IImage image, - PaintProperties paintProps) - throws VizException { - program.setUniform("alphaVal", blendAlpha); - program.setUniform("brightness", brightness); - program.setUniform("contrast", contrast); - program.setUniform("colorMap", 0); - program.setUniform("logFactor", logFactor); - program.setUniform("alphaMask", 1); - program.setUniform("applyMask", - colorMapParams.isUseMask() ? 1 : 0); - program.setUniform("bkgrndRed", - backgroundColor.red / 255.0f); - program.setUniform("bkgrndGreen", - backgroundColor.green / 255.0f); - program.setUniform("bkgrndBlue", - backgroundColor.blue / 255.0f); - } - }); - program = GLSLFactory.getInstance().getShaderProgram(this, - null, "colormap"); - if (program != null) { - program.startShader(); - program.loadData(this, null, null); - } + program = GLSLFactory.getInstance().getShaderProgram(this, + null, "colormap"); + if (program != null) { + program.startShader(); + program.setUniform("alphaVal", blendAlpha); + program.setUniform("brightness", brightness); + program.setUniform("contrast", contrast); + program.setUniform("colorMap", 0); + program.setUniform("logFactor", logFactor); + program.setUniform("alphaMask", 1); + program.setUniform("applyMask", + colorMapParams.isUseMask() ? 1 : 0); + program.setUniform("bkgrndRed", + backgroundColor.red / 255.0f); + program.setUniform("bkgrndGreen", + backgroundColor.green / 255.0f); + program.setUniform("bkgrndBlue", + backgroundColor.blue / 255.0f); } gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, @@ -894,11 +829,6 @@ public class GLTarget implements IGLTarget { } } - private float log(float f) { - // TODO Auto-generated method stub - return 0; - } - /* * (non-Javadoc) * @@ -1108,408 +1038,14 @@ public class GLTarget implements IGLTarget { * (non-Javadoc) * * @see - * com.raytheon.viz.core.gl.IGLTarget#drawRaster(com.raytheon.uf.viz.core - * .drawables.IImage, com.raytheon.uf.viz.core.PixelCoverage, - * com.raytheon.uf.viz.core.drawables.PaintProperties, java.lang.String) - */ - @Override - public boolean drawRaster(IImage image, PixelCoverage extent, - PaintProperties paintProps, String shaderProgram) - throws VizException { - return drawRaster(image, extent, paintProps, RasterMode.SYNCHRONOUS, - shaderProgram); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.gl.IGLTarget#drawRaster(com.raytheon.uf.viz.core - * .drawables.IImage, com.raytheon.uf.viz.core.PixelCoverage, + * com.raytheon.uf.viz.core.drawables.ext.IImagingExtension#drawRasters( * com.raytheon.uf.viz.core.drawables.PaintProperties, - * com.raytheon.uf.viz.core.IGraphicsTarget.RasterMode, java.lang.String) - */ - @Override - public boolean drawRaster(IImage argImage, PixelCoverage extent, - PaintProperties paintProps, RasterMode mode, String shaderProgram) - throws VizException { - DrawableImage image = new DrawableImage(argImage, extent); - image.setMode(mode); - return drawRasters(shaderProgram, paintProps, image); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.IGraphicsTarget#drawRaster(com.raytheon.uf.viz - * .core.drawables.PaintProperties, * com.raytheon.uf.viz.core.DrawableImage[]) */ @Override public boolean drawRasters(PaintProperties paintProps, DrawableImage... images) throws VizException { - return drawRasters("raster", paintProps, images); - } - - public boolean drawRasters(String shaderProgram, - PaintProperties paintProps, DrawableImage... images) - throws VizException { - gl.glGetError(); - int continues = 0; - int imgErrors = 0; - Set errorMsgs = new HashSet(); - List notDrawn = new ArrayList(); - - this.pushGLState(); - try { - gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL); - - Texture tex = null; - int texId = -1; - GLShaderProgram program = null; - boolean attemptedToLoadShader = false; - int lastTextureType = -1; - // Only kept track for GLImage types - Boolean lastInterpState = null; - - for (DrawableImage di : images) { - IImage argImage = di.getImage(); - IImage image = argImage; - PixelCoverage extent = di.getCoverage(); - RasterMode mode = di.getMode(); - - if (argImage instanceof SingleColorImage) { - image = ((SingleColorImage) argImage).getWrappedImage(); - } - - if (!(image instanceof AbstractGLImage)) { - ++continues; - ++imgErrors; - errorMsgs.add("Can only draw GLImages on GLTarget"); - notDrawn.add(di); - continue; - } - - final AbstractGLImage glImage = (AbstractGLImage) image; - - synchronized (glImage) { - if (glImage.getStatus() == IImage.Status.UNLOADED - || glImage.getStatus() == IImage.Status.LOADING) { - glImage.setStatus(IImage.Status.LOADING); - if (mode == RasterMode.ASYNCHRONOUS) { - stage(glImage); - } else if (mode == RasterMode.SYNCHRONOUS) { - glImage.stageTexture(); - } - } - - if (glImage.getStatus() == IImage.Status.STAGED) { - glImage.target(this); - } - - if (glImage.getStatus() != IImage.Status.LOADED) { - ++continues; - notDrawn.add(di); - continue; - } - - ColorMapParameters usedColorMapParameters = null; - int textureType = glImage.getTextureStorageType(); - if (image instanceof GLColormappedImage) { - texId = ((GLColormappedImage) image).getTextureid(); - } else if (image instanceof GLImage) { - tex = ((GLImage) glImage).getTexture(); - } - - if (tex == null && texId <= 0) { - errorMsgs.add("Texture not loaded"); - continues++; - notDrawn.add(di); - continue; - } - - if (lastTextureType != textureType) { - if (lastTextureType != -1) { - gl.glDisable(lastTextureType); - } - gl.glEnable(textureType); - lastTextureType = textureType; - } - - GLColormappedImage alphaMaskTexture = null; - if (texId > 0) { - // First see if the colormap has been loaded - usedColorMapParameters = ((IColormappedImage) glImage) - .getColorMapParameters(); - if (usedColorMapParameters == null - || usedColorMapParameters.getColorMap() == null) { - ++continues; - continue; - } - - if (usedColorMapParameters.isUseMask() - && capabilities.cardSupportsShaders) { - byte[] mask = usedColorMapParameters.getAlphaMask(); - alphaMaskTexture = (GLColormappedImage) initializeRaster( - CMDataPreparerManager.getDataPreparer(mask, - new java.awt.Rectangle(0, 0, - mask.length, 1), new int[] { - mask.length, 1 }), - usedColorMapParameters); - alphaMaskTexture.stageTexture(); - alphaMaskTexture.target(this); - } - - // Get and stage colormap texture - GLTextureObject cmapTexture = getColorMapTexture(usedColorMapParameters); - - if (alphaMaskTexture != null) { - gl.glActiveTexture(GL.GL_TEXTURE2); - gl.glBindTexture( - alphaMaskTexture.getTextureStorageType(), - alphaMaskTexture.getTextureid()); - } - - gl.glActiveTexture(GL.GL_TEXTURE1); - cmapTexture.bind(gl, GL.GL_TEXTURE_1D); - - if (glImage.isInterpolated()) { - gl.glTexParameteri(GL.GL_TEXTURE_1D, - GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); - gl.glTexParameteri(GL.GL_TEXTURE_1D, - GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); - } else { - gl.glTexParameteri(GL.GL_TEXTURE_1D, - GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST); - gl.glTexParameteri(GL.GL_TEXTURE_1D, - GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST); - } - - gl.glActiveTexture(GL.GL_TEXTURE0); - gl.glBindTexture(textureType, texId); - - if (glImage.isInterpolated()) { - gl.glTexParameteri(textureType, - GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); - gl.glTexParameteri(textureType, - GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); - } else { - gl.glTexParameteri(textureType, - GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST); - gl.glTexParameteri(textureType, - GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST); - } - lastInterpState = null; - } else { - tex.bind(); - boolean interp = glImage.isInterpolated(); - if (lastInterpState == null - || lastInterpState != interp) { - lastInterpState = interp; - if (glImage.isInterpolated()) { - tex.setTexParameteri(GL.GL_TEXTURE_MIN_FILTER, - GL.GL_LINEAR); - tex.setTexParameteri(GL.GL_TEXTURE_MAG_FILTER, - GL.GL_LINEAR); - } else { - tex.setTexParameteri(GL.GL_TEXTURE_MIN_FILTER, - GL.GL_NEAREST); - tex.setTexParameteri(GL.GL_TEXTURE_MAG_FILTER, - GL.GL_NEAREST); - } - } - } - - if (capabilities.cardSupportsShaders) { - if (program == null && !attemptedToLoadShader) { - attemptedToLoadShader = true; - program = GLSLFactory - .getInstance() - .getShaderProgram(this, null, shaderProgram); - if (program != null) { - program.startShader(); - } - - gl.glTexEnvi(GL.GL_TEXTURE_ENV, - GL.GL_TEXTURE_ENV_MODE, GL.GL_ADD); - gl.glEnable(GL.GL_BLEND); - gl.glTexEnvi(GL.GL_TEXTURE_ENV, - GL.GL_TEXTURE_ENV_MODE, GL.GL_BLEND); - gl.glBlendFunc(GL.GL_SRC_ALPHA, - GL.GL_ONE_MINUS_SRC_ALPHA); - - gl.glColor4f(0.0f, 0.0f, 0.0f, - paintProps.getAlpha()); - } - - if (program != null) { - program.loadData(this, argImage, paintProps); - } - } else { - gl.glEnable(GL.GL_BLEND); - gl.glBlendFunc(GL.GL_SRC_ALPHA, - GL.GL_ONE_MINUS_SRC_ALPHA); - gl.glColor4f(1.0f, 1.0f, 1.0f, paintProps.getAlpha()); - } - - TextureCoords coords; - if (texId == -1) { - coords = tex.getImageTexCoords(); - } else { - coords = new TextureCoords(0, 1, 1, 0); - } - - drawCoverage(paintProps, extent, coords, 0); - - if (alphaMaskTexture != null) { - gl.glActiveTexture(GL.GL_TEXTURE2); - gl.glBindTexture( - alphaMaskTexture.getTextureStorageType(), 0); - } - - gl.glActiveTexture(GL.GL_TEXTURE1); - gl.glBindTexture(GL.GL_TEXTURE_1D, 0); - gl.glActiveTexture(GL.GL_TEXTURE0); - gl.glBindTexture(textureType, 0); - - if (usedColorMapParameters != null) { - this.lastColormapUsed = usedColorMapParameters; - } - this.lastAlphaUsed = paintProps.getAlpha(); - - if (alphaMaskTexture != null) { - alphaMaskTexture.dispose(); - } - - // Enable if you want to see mesh drawn - if (false) { - if (program != null) { - program.endShader(); - } - gl.glDisable(GL.GL_BLEND); - gl.glColor3f(0.0f, 1.0f, 0.0f); - gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINE); - drawCoverage(paintProps, extent, new TextureCoords(0, - 1, 1, 0), 0.0f); - gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL); - gl.glEnable(GL.GL_BLEND); - if (program != null) { - program.startShader(); - } - - } - } - } - - if (lastTextureType != -1) { - gl.glDisable(lastTextureType); - } - - if (program != null) { - program.endShader(); - } - - gl.glPolygonMode(GL.GL_BACK, GL.GL_LINE); - - gl.glDisable(GL.GL_BLEND); - - for (DrawableImage di : notDrawn) { - if (drawTileBoundaries) { - gl.glColor3f(0.0f, 1.0f, 0.0f); - gl.glPolygonMode(GL.GL_FRONT, GL.GL_LINE); - drawCoverage(paintProps, di.getCoverage(), - new TextureCoords(0, 1, 1, 0), 0.0f); - gl.glPolygonMode(GL.GL_FRONT, GL.GL_FILL); - } - } - - } finally { - this.popGLState(); - } - - handleError(gl.glGetError()); - - if (errorMsgs.size() > 0) { - throw new VizException("Error rendering " + errorMsgs.size() - + " images: " + errorMsgs); - } - - boolean allDrawn = continues == 0; - if (!allDrawn) { - this.setNeedsRefresh(true); - synchronized (this) { - if (refreshCount <= 1) { - refreshCount++; - } - } - } - - return allDrawn; - } - - public void drawCoverage(PaintProperties paintProps, PixelCoverage pc, - TextureCoords coords, float corrFactor) throws VizException { - if (pc == null) { - return; - } - this.pushGLState(); - try { - // gl.glPolygonMode(GL.GL_BACK, GL.GL_FILL); - // gl.glColor3d(1.0, 0.0, 0.0); - // } - - // boolean useNormals = false; - IMesh mesh = pc.getMesh(); - - // if mesh exists, use it - if (mesh != null) { - mesh.paint(this, paintProps); - } else if (coords != null) { - FloatBuffer fb = ByteBuffer.allocateDirect(4 * 5 * 4) - .order(ByteOrder.nativeOrder()).asFloatBuffer(); - - Coordinate ul = pc.getUl(); - Coordinate ur = pc.getUr(); - Coordinate lr = pc.getLr(); - Coordinate ll = pc.getLl(); - - fb.put(new float[] { coords.left() + corrFactor, - coords.bottom() + corrFactor }); - fb.put(new float[] { (float) ll.x, (float) ll.y, (float) ll.z }); - - fb.put(new float[] { coords.right() - corrFactor, - coords.bottom() + corrFactor }); - fb.put(new float[] { (float) lr.x, (float) lr.y, (float) lr.z }); - - fb.put(new float[] { coords.left() + corrFactor, - coords.top() - corrFactor }); - fb.put(new float[] { (float) ul.x, (float) ul.y, (float) ul.z }); - - fb.put(new float[] { coords.right() - corrFactor, - coords.top() - corrFactor }); - fb.put(new float[] { (float) ur.x, (float) ur.y, (float) ur.z }); - - // Clear error bit - gl.glGetError(); - - gl.glEnableClientState(GL.GL_VERTEX_ARRAY); - gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY); - - gl.glInterleavedArrays(GL.GL_T2F_V3F, 0, fb.rewind()); - int error = gl.glGetError(); - if (error == GL.GL_NO_ERROR) { - gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, 4); - } else { - handleError(error); - } - - gl.glDisableClientState(GL.GL_VERTEX_ARRAY); - gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY); - } - } finally { - this.popGLState(); - } + return ImagingSupport.drawRasters(this, paintProps, images); } /* @@ -1878,7 +1414,6 @@ public class GLTarget implements IGLTarget { private void drawWireframeShapeInternal(GLWireframeShape shape, RGB color, float lineWidth, LineStyle lineStyle, IGLFont font, float alpha) throws VizException { - this.pushGLState(); try { @@ -2030,27 +1565,10 @@ public class GLTarget implements IGLTarget { @Override public void endFrame() { makeContextCurrent(); - try { - if (this.lastColormapUsed != null && this.useBuiltinColorbar) { - this.drawColorbar(this.lastColormapUsed); - } - } catch (VizException e) { - e.printStackTrace(); - } - - if (theCanvas != null && theCanvas.isDisposed()) { - return; - } - gl.glFinish(); - if (theCanvas != null) { - // if (allImagesSuccessfullyDrawn || redrawRetries > 0) { + if (theCanvas != null && theCanvas.isDisposed() == false) { theCanvas.swapBuffers(); - // redrawRetries = 0; - // } else { - // redrawRetries++; - // } } GLContextBridge.makeMasterContextCurrent(); @@ -2269,14 +1787,8 @@ public class GLTarget implements IGLTarget { * .uf.viz.core.data.IRenderedImageCallback) */ @Override - public AbstractGLImage initializeRaster(IRenderedImageCallback imageCallback) { - GLImage image = new GLImage(imageCallback, this); - try { - image.stageTexture(); - } catch (VizException e) { - statusHandler.handle(Priority.PROBLEM, "Error staging texture", e); - } - return image; + public IImage initializeRaster(IRenderedImageCallback imageCallback) { + return new GLImage(imageCallback, GLDefaultImagingExtension.class); } /* @@ -2559,33 +2071,6 @@ public class GLTarget implements IGLTarget { gl.glPopMatrix(); } - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.IGraphicsTarget#setUseBuiltinColorbar(boolean) - */ - @Override - public void setUseBuiltinColorbar(boolean isColorbarDisplayed) { - this.useBuiltinColorbar = isColorbarDisplayed; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.IGraphicsTarget#stage(com.raytheon.viz.core.drawables - * .IImage) - */ - @Override - public void stage(final IImage image) throws VizException { - if (!(image instanceof AbstractGLImage)) { - throw new VizException("Must pass GLImages to GLTarget"); - } - - TextureLoaderJob.getInstance().requestLoad((AbstractGLImage) image); - - } - /** * (non-Javadoc) * @@ -2693,67 +2178,6 @@ public class GLTarget implements IGLTarget { return this.canvasSize; } - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.IGLTarget#bindTexture(int, - * com.raytheon.viz.core.gl.internal.images.AbstractGLColormappedImage) - */ - @Override - public void bindTexture(int textureUnit, GLColormappedImage image) { - gl.glActiveTexture(textureUnit); - gl.glBindTexture(image.getTextureStorageType(), image.getTextureid()); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.IGLTarget#disposeOcclusionQuery(int) - */ - @Override - public void disposeOcclusionQueries(int[] id) { - gl.glDeleteQueriesARB(id.length, id, 0); - - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.gl.IGLTarget#beginOcclusionTest(com.raytheon.viz - * .core.IRenderableDisplay) - */ - @Override - public void beginOcclusionTest(IRenderableDisplay display) - throws VizException { - beginFrame(display, true); - - // don't actually update framebuffer - gl.glColorMask(false, false, false, false); - gl.glDisable(GL.GL_CULL_FACE); - gl.glDisable(GL.GL_NORMALIZE); - - gl.glDisable(GL.GL_STENCIL_TEST); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.IGLTarget#endOcclusionTest() - */ - @Override - public void endOcclusionTest() throws VizException { - - // don't actually update framebuffer - gl.glColorMask(true, true, true, true); - // gl.glEnable(GL.GL_CULL_FACE); - // gl.glEnable(GL.GL_NORMALIZE); - - gl.glDepthFunc(GL.GL_LESS); - gl.glEnable(GL.GL_STENCIL_TEST); - - } - public void drawCylinder(PixelCoordinate coord, RGB color, float alpha, double height, double baseRadius, double topRadius, int sideCount, int sliceCount, double rotation, double lean) { @@ -2849,12 +2273,24 @@ public class GLTarget implements IGLTarget { return VizConstants.VIEW_2D; } - private void pushGLState() { + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.IGLTarget#pushGLState() + */ + @Override + public void pushGLState() { gl.glPushAttrib(GL.GL_COLOR_BUFFER_BIT | GL.GL_CURRENT_BIT | GL.GL_ENABLE_BIT | GL.GL_TEXTURE_BIT | GL.GL_LINE_BIT); } - private void popGLState() { + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.IGLTarget#popGLState() + */ + @Override + public void popGLState() { gl.glPopAttrib(); } @@ -2863,7 +2299,15 @@ public class GLTarget implements IGLTarget { this.updatedExtent = updatedExtent; } - private GLTextureObject getColorMapTexture(ColorMapParameters cmapParams) { + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.IGLTarget#getColorMapTexture(com.raytheon.uf + * .viz.core.drawables.ColorMapParameters) + */ + @Override + public GLTextureObject getColorMapTexture(ColorMapParameters cmapParams) { IColorMap cmap = cmapParams.getColorMap(); String name = cmap.getName(); if (name == null) { @@ -3672,9 +3116,25 @@ public class GLTarget implements IGLTarget { } @Override - public final T getExtension(Class extensionClass) - throws VizException { - return extensionManager.getExtension(extensionClass); + public final T getExtension( + Class extensionClass) throws VizException { + Class toUse = extensionClass; + if (extensionClass == IImagingExtension.class) { + toUse = GLDefaultImagingExtension.class; + } + return extensionClass.cast(extensionManager.getExtension(toUse)); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.IGraphicsTarget#setUseBuiltinColorbar(boolean) + */ + @Override + @Deprecated + public void setUseBuiltinColorbar(boolean isColorbarDisplayed) { + // No effect } } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLWireframeShape.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLWireframeShape.java index 6026310930..98212d2d16 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLWireframeShape.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLWireframeShape.java @@ -802,7 +802,8 @@ public class GLWireframeShape implements IWireframeShape { recursiveDispose(baseLevel); if (vboAssociatedTarget != null && vboID > 0) { - vboAssociatedTarget.disposeVBO(vboID); + vboAssociatedTarget.getGl().glDeleteBuffers(1, new int[] { vboID }, + 0); vboID = 0; vboAssociatedTarget = null; } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLWireframeShape2D.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLWireframeShape2D.java index cc6e7b756f..ebacba59f9 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLWireframeShape2D.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/GLWireframeShape2D.java @@ -28,17 +28,22 @@ import javax.media.opengl.GL; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; import org.geotools.coverage.grid.GeneralGridGeometry; +import org.geotools.referencing.operation.DefaultMathTransformFactory; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.TransformException; +import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.core.DrawableString; import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.IGraphicsTarget.HorizontalAlignment; import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; import com.raytheon.uf.viz.core.IGraphicsTarget.VerticalAlignment; import com.raytheon.uf.viz.core.PixelExtent; -import com.raytheon.uf.viz.core.drawables.IDescriptor; +import com.raytheon.uf.viz.core.drawables.AbstractDescriptor; import com.raytheon.uf.viz.core.drawables.IFont; import com.raytheon.uf.viz.core.drawables.IWireframeShape; import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.viz.core.gl.Activator; import com.raytheon.viz.core.gl.GLGeometryObject2D; import com.raytheon.viz.core.gl.GLGeometryObject2D.GLGeometryObjectData; import com.raytheon.viz.core.gl.IGLTarget; @@ -69,7 +74,7 @@ public class GLWireframeShape2D implements IWireframeShape { /** list of labels to draw */ private List labels; - private IDescriptor descriptor; + private MathTransform worldToTargetGrid; private boolean compiled = false; @@ -82,12 +87,22 @@ public class GLWireframeShape2D implements IWireframeShape { GL.GL_VERTEX_ARRAY); geomData.mutable = mutable; geomData.worldExtent = new PixelExtent(gridGeometry.getGridRange()); - initialize(); - } - public GLWireframeShape2D(IDescriptor descriptor, boolean mutable) { - this(descriptor.getGridGeometry(), mutable); - this.descriptor = descriptor; + MathTransform worldToCRS = AbstractDescriptor + .getWorldToCRSTransform(gridGeometry); + if (worldToCRS != null) { + try { + MathTransform crsToGrid = gridGeometry.getGridToCRS().inverse(); + worldToTargetGrid = new DefaultMathTransformFactory() + .createConcatenatedTransform(worldToCRS, crsToGrid); + } catch (Exception e) { + Activator.statusHandler.handle(Priority.PROBLEM, + "Error getting transform from base crs to target grid", + e); + } + } + + initialize(); } private void initialize() { @@ -158,16 +173,23 @@ public class GLWireframeShape2D implements IWireframeShape { */ @Override public void addLineSegment(Coordinate[] worldCoords) { - if (descriptor == null) { - throw new UnsupportedOperationException( - "Cannot add coordinate line segment to a wireframe shape that does not have a MapDescriptor."); - } - double screenCoords[][] = new double[worldCoords.length][]; for (int i = 0; i < worldCoords.length; ++i) { Coordinate c = worldCoords[i]; - screenCoords[i] = descriptor - .worldToPixel(new double[] { c.x, c.y }); + if (worldToTargetGrid != null) { + try { + double[] out = new double[2]; + worldToTargetGrid.transform(new double[] { c.x, c.y }, 0, + out, 0, 1); + screenCoords[i] = out; + } catch (TransformException e) { + // Ignore... + } + } else { + // Assume no conversion needed + screenCoords[i] = new double[] { c.x, c.y }; + } + } addLineSegment(screenCoords); } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLColormapShadedShapeExtension.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLColormapShadedShapeExtension.java index 972a2d5399..ef79916243 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLColormapShadedShapeExtension.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLColormapShadedShapeExtension.java @@ -246,7 +246,7 @@ public class GLColormapShadedShapeExtension extends */ @Override public int getCompatibilityValue(IGLTarget target) { - return Compatibilty.TARGET_COMPATIBLE.value; + return Compatibilty.TARGET_COMPATIBLE; } } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLColormappedImageExtension.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLColormappedImageExtension.java index 9c2b26a3de..8b15f26afe 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLColormappedImageExtension.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLColormappedImageExtension.java @@ -19,19 +19,23 @@ **/ package com.raytheon.viz.core.gl.internal.ext; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; +import java.nio.ByteBuffer; + +import javax.media.opengl.GL; + +import com.raytheon.uf.viz.core.PixelCoverage; import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.IColormappedImage; -import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension; +import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.drawables.ext.colormap.IColormappedImageExtension; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.gl.GLCapabilities; -import com.raytheon.viz.core.gl.IGLTarget; +import com.raytheon.viz.core.gl.glsl.AbstractGLSLImagingExtension; +import com.raytheon.viz.core.gl.glsl.GLShaderProgram; +import com.raytheon.viz.core.gl.images.AbstractGLImage; import com.raytheon.viz.core.gl.images.GLColormappedImage; -import com.raytheon.viz.core.gl.internal.GLTarget; +import com.raytheon.viz.core.gl.objects.GLTextureObject; /** * GL {@link IColormappedImageExtension} implementation, creates @@ -51,11 +55,12 @@ import com.raytheon.viz.core.gl.internal.GLTarget; * @version 1.0 */ -public class GLColormappedImageExtension extends GraphicsExtension +public class GLColormappedImageExtension extends AbstractGLSLImagingExtension implements IColormappedImageExtension { - private static final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(GLColormappedImageExtension.class); + private static class GLColormappedImageExtensionData { + public GLColormappedImage alphaMaskTexture; + } /* * (non-Javadoc) @@ -66,33 +71,165 @@ public class GLColormappedImageExtension extends GraphicsExtension * com.raytheon.uf.viz.core.drawables.ColorMapParameters) */ @Override - public IColormappedImage initializeRaster( + public GLColormappedImage initializeRaster( IColorMapDataRetrievalCallback dataCallback, ColorMapParameters colorMapParameters) { - GLColormappedImage image = new GLColormappedImage(dataCallback, - colorMapParameters, target); - try { - image.stageTexture(); - } catch (VizException e) { - statusHandler.handle(Priority.PROBLEM, "Error staging texture", e); - } - return image; + return new GLColormappedImage(dataCallback, colorMapParameters, + GLColormappedImageExtension.class); } /* * (non-Javadoc) * - * @see com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension# - * getCompatibilityValue(com.raytheon.uf.viz.core.IGraphicsTarget) + * @see + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#preImageRender + * (com.raytheon.uf.viz.core.drawables.PaintProperties, + * com.raytheon.viz.core.gl.images.AbstractGLImage) */ @Override - public int getCompatibilityValue(IGLTarget target) { - if (GLCapabilities.getInstance(target.getGl()).cardSupportsShaders - && GLTarget.FORCE_NO_SHADER == false) { - return Compatibilty.ENHANCED_TARGET_COMPATIBLE.value; - } else { - return Compatibilty.INCOMPATIBLE.value; + public Object preImageRender(PaintProperties paintProps, + AbstractGLImage image, PixelCoverage coverage) throws VizException { + GLColormappedImageExtensionData data = null; + if (image instanceof GLColormappedImage) { + data = new GLColormappedImageExtensionData(); + GL gl = target.getGl(); + GLColormappedImage glImage = (GLColormappedImage) image; + // First see if the colormap has been loaded + ColorMapParameters usedColorMapParameters = ((IColormappedImage) glImage) + .getColorMapParameters(); + if (usedColorMapParameters == null + || usedColorMapParameters.getColorMap() == null) { + return null; + } + + if (usedColorMapParameters.isUseMask()) { + final byte[] mask = usedColorMapParameters.getAlphaMask(); + data.alphaMaskTexture = initializeRaster( + new IColorMapDataRetrievalCallback() { + @Override + public ColorMapData getColorMapData() + throws VizException { + return new ColorMapData(ByteBuffer.wrap(mask), + new int[] { mask.length, 1 }); + } + }, usedColorMapParameters); + data.alphaMaskTexture.stage(); + data.alphaMaskTexture.target(target); + } + + // Get and stage colormap texture + GLTextureObject cmapTexture = target + .getColorMapTexture(usedColorMapParameters); + + if (data.alphaMaskTexture != null) { + gl.glActiveTexture(GL.GL_TEXTURE2); + gl.glBindTexture(data.alphaMaskTexture.getTextureStorageType(), + data.alphaMaskTexture.getTextureid()); + } + + gl.glActiveTexture(GL.GL_TEXTURE1); + cmapTexture.bind(gl, GL.GL_TEXTURE_1D); + + if (glImage.isInterpolated()) { + gl.glTexParameteri(GL.GL_TEXTURE_1D, GL.GL_TEXTURE_MIN_FILTER, + GL.GL_LINEAR); + gl.glTexParameteri(GL.GL_TEXTURE_1D, GL.GL_TEXTURE_MAG_FILTER, + GL.GL_LINEAR); + } else { + gl.glTexParameteri(GL.GL_TEXTURE_1D, GL.GL_TEXTURE_MIN_FILTER, + GL.GL_NEAREST); + gl.glTexParameteri(GL.GL_TEXTURE_1D, GL.GL_TEXTURE_MAG_FILTER, + GL.GL_NEAREST); + } } + return data; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#postImageRender + * (com.raytheon.uf.viz.core.drawables.PaintProperties, + * com.raytheon.viz.core.gl.images.AbstractGLImage, java.lang.Object) + */ + @Override + public void postImageRender(PaintProperties paintProps, + AbstractGLImage image, Object data) throws VizException { + GLColormappedImageExtensionData imageData = (GLColormappedImageExtensionData) data; + GL gl = target.getGl(); + if (imageData.alphaMaskTexture != null) { + gl.glActiveTexture(GL.GL_TEXTURE2); + gl.glBindTexture( + imageData.alphaMaskTexture.getTextureStorageType(), 0); + + imageData.alphaMaskTexture.dispose(); + } + + gl.glActiveTexture(GL.GL_TEXTURE1); + gl.glBindTexture(GL.GL_TEXTURE_1D, 0); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#getShaderProgramName + * () + */ + @Override + public String getShaderProgramName() { + return "colormapRaster"; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#loadShaderData + * (com.raytheon.viz.core.gl.glsl.GLShaderProgram, + * com.raytheon.uf.viz.core.drawables.IImage, + * com.raytheon.uf.viz.core.drawables.PaintProperties) + */ + @Override + public void loadShaderData(GLShaderProgram program, IImage iimage, + PaintProperties paintProps) throws VizException { + // Get image as AbstractGLImage + GLColormappedImage image = null; + if (iimage instanceof GLColormappedImage == false) { + throw new VizException( + "Cannot apply glsl colormap raster shader to non gl colormap image"); + } + image = (GLColormappedImage) iimage; + + GLColormappedImage colormappedImg = (GLColormappedImage) image; + ColorMapParameters colorMapParameters = colormappedImg + .getColorMapParameters(); + + program.setUniform("colorMapSz", colorMapParameters.getColorMap() + .getSize()); + int textureType = ((GLColormappedImage) image).getTextureType(); + program.setUniform("isFloat", textureType == GL.GL_FLOAT + || textureType == GL.GL_HALF_FLOAT_ARB ? 1 : 0); + program.setUniform("logarithmic", + colorMapParameters.isLogarithmic() ? 1 : 0); + program.setUniform("logFactor", colorMapParameters.getLogFactor()); + program.setUniform("mirror", colorMapParameters.isMirror() ? 1 : 0); + + program.setUniform("applyMask", colorMapParameters.isUseMask() ? 1 : 0); + + program.setUniform("naturalMin", colorMapParameters.getDataMin()); + program.setUniform("naturalMax", colorMapParameters.getDataMax()); + program.setUniform("cmapMin", colorMapParameters.getColorMapMin()); + program.setUniform("cmapMax", colorMapParameters.getColorMapMax()); + + program.setUniform("alphaMask", 2); + program.setUniform("colorMap", 1); + program.setUniform("rawText", 0); + + program.setUniform("brightness", image.getBrightness()); + program.setUniform("contrast", image.getContrast()); + program.setUniform("alpha", paintProps.getAlpha()); } } diff --git a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/MosaicShaderLoader.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLDefaultImagingExtension.java similarity index 51% rename from cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/MosaicShaderLoader.java rename to cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLDefaultImagingExtension.java index 9fff8ae853..83b6fba72a 100644 --- a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/MosaicShaderLoader.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLDefaultImagingExtension.java @@ -17,27 +17,25 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.uf.viz.radar.gl.mosaic; - -import javax.media.opengl.GL; +package com.raytheon.viz.core.gl.internal.ext; import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.gl.IGLTarget; -import com.raytheon.viz.core.gl.glsl.AbstractShaderLoader; +import com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension; import com.raytheon.viz.core.gl.glsl.GLShaderProgram; import com.raytheon.viz.core.gl.images.AbstractGLImage; /** - * Loads variables for mosiac fragment shader + * TODO Add Description * *
  * 
  * SOFTWARE HISTORY
+ * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
- * Jun 10, 2010            mschenke     Initial creation
+ * Dec 16, 2011            mschenke     Initial creation
  * 
  * 
* @@ -45,39 +43,44 @@ import com.raytheon.viz.core.gl.images.AbstractGLImage; * @version 1.0 */ -public class MosaicShaderLoader extends AbstractShaderLoader { +public class GLDefaultImagingExtension extends AbstractGLImagingExtension { /* * (non-Javadoc) * * @see - * com.raytheon.viz.core.gl.glsl.IShaderLoader#loadData(com.raytheon.viz - * .core.gl.IGLTarget, com.raytheon.viz.core.gl.glsl.GLShaderProgram, + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#getShaderProgramName + * () + */ + @Override + public String getShaderProgramName() { + return "raster"; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#loadShaderData + * (com.raytheon.viz.core.gl.glsl.GLShaderProgram, * com.raytheon.uf.viz.core.drawables.IImage, * com.raytheon.uf.viz.core.drawables.PaintProperties) */ @Override - public void loadData(IGLTarget target, GLShaderProgram program, - IImage image, PaintProperties paintProps) throws VizException { - // load radar data to GL_TEXTURE0 (bound in drawRaster) - program.setUniform("radarData", 0); + public void loadShaderData(GLShaderProgram program, IImage iimage, + PaintProperties paintProps) throws VizException { + // Get image as AbstractGLImage + AbstractGLImage image = null; + if (iimage instanceof AbstractGLImage == false) { + throw new VizException( + "Cannot apply glsl raster shader to non gl image"); + } + image = (AbstractGLImage) iimage; - GL gl = target.getGl(); - - // grab currently writting to texture - AbstractGLImage writeTo = (AbstractGLImage) RadarMosaicRenderer - .getCurrentMosaicImage(); - - // activate on texture2 as 0 is radar image and 1 is colormap - gl.glActiveTexture(GL.GL_TEXTURE2); - gl.glBindTexture(writeTo.getTextureStorageType(), - writeTo.getTextureid()); - - program.setUniform("mosaicTexture", 2); - - // pass in width and height - program.setUniform("height", (paintProps.getCanvasBounds().height)); - program.setUniform("width", (paintProps.getCanvasBounds().width)); + program.setUniform("alpha", paintProps.getAlpha()); + program.setUniform("brightness", image.getBrightness()); + program.setUniform("contrast", image.getContrast()); + program.setUniform("rawTex", 0); } } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLMapMeshExtension.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLMapMeshExtension.java index c6f4abf8b5..97b08b7aed 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLMapMeshExtension.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLMapMeshExtension.java @@ -19,10 +19,13 @@ **/ package com.raytheon.viz.core.gl.internal.ext; +import org.geotools.coverage.grid.GeneralGridGeometry; +import org.geotools.coverage.grid.GridGeometry2D; + import com.raytheon.uf.viz.core.IMesh; +import com.raytheon.uf.viz.core.drawables.IDescriptor; import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.map.IMapDescriptor; import com.raytheon.uf.viz.core.map.IMapMeshExtension; import com.raytheon.viz.core.gl.IGLTarget; import com.raytheon.viz.core.gl.internal.GLMesh2DStrips; @@ -51,12 +54,28 @@ public class GLMapMeshExtension extends GraphicsExtension implements * (non-Javadoc) * * @see - * com.raytheon.uf.viz.core.map.IMapMeshExtension#constructMesh(com.raytheon - * .uf.viz.core.map.IMapDescriptor) + * com.raytheon.uf.viz.core.map.IMapMeshExtension#constructMesh(org.geotools + * .coverage.grid.GridGeometry2D, + * org.geotools.coverage.grid.GeneralGridGeometry) */ @Override - public IMesh constructMesh(IMapDescriptor descriptor) throws VizException { - return new GLMesh2DStrips(descriptor); + public IMesh constructMesh(GridGeometry2D imageGeometry, + GeneralGridGeometry targetGeometry) throws VizException { + return new GLMesh2DStrips(imageGeometry, targetGeometry); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.map.IMapMeshExtension#constructMesh(org.geotools + * .coverage.grid.GridGeometry2D, + * com.raytheon.uf.viz.core.drawables.IDescriptor) + */ + @Override + public IMesh constructMesh(GridGeometry2D imageGeometry, + IDescriptor targetDescriptor) throws VizException { + return constructMesh(imageGeometry, targetDescriptor.getGridGeometry()); } /* @@ -67,7 +86,7 @@ public class GLMapMeshExtension extends GraphicsExtension implements */ @Override public int getCompatibilityValue(IGLTarget target) { - return Compatibilty.TARGET_COMPATIBLE.value; + return Compatibilty.TARGET_COMPATIBLE; } } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLSingleColorImageExtension.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLSingleColorImageExtension.java new file mode 100644 index 0000000000..480f06220f --- /dev/null +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLSingleColorImageExtension.java @@ -0,0 +1,114 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.viz.core.gl.internal.ext; + +import java.awt.image.RenderedImage; + +import org.eclipse.swt.graphics.RGB; + +import com.raytheon.uf.viz.core.data.IRenderedImageCallback; +import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.ext.ISingleColorImageExtension; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.viz.core.gl.glsl.AbstractGLSLImagingExtension; +import com.raytheon.viz.core.gl.glsl.GLShaderProgram; +import com.raytheon.viz.core.gl.images.GLImage; +import com.raytheon.viz.core.gl.images.GLSingleColorImage; + +/** + * GL implementation of ISingleColorImageExtension, uses shader to assign color + * value + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Dec 15, 2011            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class GLSingleColorImageExtension extends AbstractGLSLImagingExtension + implements ISingleColorImageExtension { + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#getShaderProgramName + * () + */ + @Override + public String getShaderProgramName() { + return "singleColor"; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.ext.ISingleColorImageExtension# + * constructImage(com.raytheon.uf.viz.core.drawables.IImage, + * org.eclipse.swt.graphics.RGB) + */ + @Override + public ISingleColorImage constructImage(final RenderedImage image, RGB color) { + return new GLSingleColorImage(new GLImage(new IRenderedImageCallback() { + @Override + public RenderedImage getImage() throws VizException { + return image; + } + }, GLSingleColorImageExtension.class), color); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#loadShaderData + * (com.raytheon.viz.core.gl.glsl.GLShaderProgram, + * com.raytheon.uf.viz.core.drawables.IImage, + * com.raytheon.uf.viz.core.drawables.PaintProperties) + */ + @Override + public void loadShaderData(GLShaderProgram program, IImage iimage, + PaintProperties paintProps) throws VizException { + // Get image as AbstractGLImage + GLSingleColorImage image = null; + if (iimage instanceof GLSingleColorImage == false) { + throw new VizException( + "Cannot apply single color raster shader to non single color image"); + } + + image = (GLSingleColorImage) iimage; + + program.setUniform("brightness", image.getBrightness()); + program.setUniform("contrast", image.getContrast()); + program.setUniform("alpha", paintProps.getAlpha()); + program.setUniform("color", image.getColor()); + program.setUniform("rawTex", 0); + } + +} diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/objects/GLVertexBufferObject.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/objects/GLVertexBufferObject.java index da0c8a880e..e4ac6fa2be 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/objects/GLVertexBufferObject.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/objects/GLVertexBufferObject.java @@ -50,7 +50,7 @@ public class GLVertexBufferObject extends GLIdWrapper { * @param gl */ public GLVertexBufferObject(Object parent) { - super(); + super(parent); } /** diff --git a/cave/com.raytheon.viz.core.graphing/src/com/raytheon/viz/core/graphing/GraphDescriptor.java b/cave/com.raytheon.viz.core.graphing/src/com/raytheon/viz/core/graphing/GraphDescriptor.java index de9633d3b9..dad4f696d4 100644 --- a/cave/com.raytheon.viz.core.graphing/src/com/raytheon/viz/core/graphing/GraphDescriptor.java +++ b/cave/com.raytheon.viz.core.graphing/src/com/raytheon/viz/core/graphing/GraphDescriptor.java @@ -24,16 +24,10 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import org.geotools.coverage.grid.GeneralGridEnvelope; -import org.geotools.coverage.grid.GeneralGridGeometry; -import org.geotools.coverage.grid.GridGeometry2D; -import org.geotools.geometry.GeneralEnvelope; import org.geotools.referencing.crs.DefaultEngineeringCRS; -import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.adapters.CoordAdapter; -import com.raytheon.uf.common.serialization.adapters.GridGeometryAdapter; import com.raytheon.uf.viz.core.PixelExtent; import com.raytheon.uf.viz.core.drawables.AbstractDescriptor; import com.vividsolutions.jts.geom.Coordinate; @@ -65,34 +59,12 @@ public class GraphDescriptor extends AbstractDescriptor implements protected int verticalFrameCount = 0; - @XmlElement - @XmlJavaTypeAdapter(value = GridGeometryAdapter.class) - protected GeneralGridGeometry geometry; - public GraphDescriptor() { this(new PixelExtent(0, 1000, 0, 1000)); } public GraphDescriptor(PixelExtent anExtent) { - super(); - GeneralEnvelope envelope = new GeneralEnvelope(2); - envelope.setRange(0, anExtent.getMinX(), anExtent.getMaxX()); - envelope.setRange(1, anExtent.getMinY(), anExtent.getMaxY()); - envelope.setCoordinateReferenceSystem(DefaultEngineeringCRS.CARTESIAN_2D); - geometry = new GridGeometry2D(new GeneralGridEnvelope( - new int[] { 0, 0 }, new int[] { (int) anExtent.getWidth(), - (int) anExtent.getHeight() }, false), envelope); - } - - @Override - public CoordinateReferenceSystem getCRS() { - // TODO Auto-generated method stub - return null; - } - - @Override - public GeneralGridGeometry getGridGeometry() { - return geometry; + super(createGridGeometry(anExtent, DefaultEngineeringCRS.CARTESIAN_2D)); } /** @@ -110,24 +82,4 @@ public class GraphDescriptor extends AbstractDescriptor implements this.location = location; } - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.drawables.IDescriptor#pixelToWorld(double[]) - */ - @Override - public double[] pixelToWorld(double[] pixel) { - return pixel; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.drawables.IDescriptor#worldToPixel(double[]) - */ - @Override - public double[] worldToPixel(double[] worldPixel) { - return worldPixel; - } - } diff --git a/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/displays/GriddedImageDisplay2.java b/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/displays/GriddedImageDisplay2.java index ad1f00c583..02f0e02610 100644 --- a/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/displays/GriddedImageDisplay2.java +++ b/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/displays/GriddedImageDisplay2.java @@ -139,7 +139,8 @@ public class GriddedImageDisplay2 extends AbstractTileSet { } // tile bounds - Rectangle rect = this.tileSet.getTileSet().get(level)[i][j].rect; + Rectangle rect = this.tileSet.getTileSet().get(level)[i][j] + .getRectangle(); // total width int width = gridGeometry[level].getGridRange().getSpan(0); IImage image = null; diff --git a/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/hdf5/AbstractTileSet.java b/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/hdf5/AbstractTileSet.java index 91a9d7f660..4204b49667 100644 --- a/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/hdf5/AbstractTileSet.java +++ b/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/hdf5/AbstractTileSet.java @@ -51,11 +51,9 @@ import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.viz.core.AbstractGraphicsFactoryAdapter; import com.raytheon.uf.viz.core.DrawableImage; -import com.raytheon.uf.viz.core.GraphicsFactory; import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.IGraphicsTarget.RasterMode; -import com.raytheon.uf.viz.core.IMesh; import com.raytheon.uf.viz.core.IMeshCallback; import com.raytheon.uf.viz.core.PixelCoverage; import com.raytheon.uf.viz.core.VizApp; @@ -72,7 +70,6 @@ import com.raytheon.uf.viz.core.rsc.AbstractVizResource; import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; -import com.raytheon.uf.viz.core.rsc.hdf5.MeshCalculatorJob; import com.vividsolutions.jts.geom.Coordinate; /** @@ -192,7 +189,6 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { this.tileSize = tileSize; this.rsc = rsc; this.cellOrientation = pixelOrientation; - graphicsAdapter = GraphicsFactory.getGraphicsAdapter(viewType); setup(levels, tileSize, gridGeometry); } @@ -216,7 +212,6 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { this.rsc = rsc; } setSharedGeometryTileSet(sharedGeometryTileset); - disposed = false; } /** @@ -261,7 +256,6 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { protected void setup(int levels, int tileSize, GridGeometry2D gridGeometry) throws VizException { - disposed = false; this.levels = levels; try { @@ -392,15 +386,8 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { if (generalEnv.intersects(generalMapEnv, true)) { tiles[i][j] = new ImageTile(); - - tiles[i][j].rect = new Rectangle(startX, startY, - effectiveWidth, effectiveHeight); - - tiles[i][j].envelope = env; - tiles[i][j].elevation = this.elevation; - // System.out.println(tiles[i][j].envelope.toString()); - tiles[i][j].rect.width = effectiveWidth; - tiles[i][j].rect.height = effectiveHeight; + tiles[i][j].setGridGeometry(new Rectangle(startX, + startY, effectiveWidth, effectiveHeight), env); } } @@ -429,24 +416,22 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { for (int i = 0; i < tiles.length; i++) { for (int j = 0; j < tiles[i].length; j++) { ImageTile tile = tiles[i][j]; - if (tile != null && tile.occlude == false) { - if (tile.coverage != null - && tile.coverage.intersects(extent)) { - IImage image = imageMap.get(tile); - if (image == null || image.getStatus() == Status.FAILED - || image.getStatus() == Status.INVALID) { + if (tile != null && tile.coverage != null + && tile.coverage.intersects(extent)) { + IImage image = imageMap.get(tile); + if (image == null || image.getStatus() == Status.FAILED + || image.getStatus() == Status.INVALID) { - try { - if (!this.hasDataPreloaded(lvl)) { - this.preloadDataObject(lvl); - } - } catch (StorageException e) { - throw new VizException( - "Error reading data to draw: ", e); + try { + if (!this.hasDataPreloaded(lvl)) { + this.preloadDataObject(lvl); } - - tilesToCreate.add(new Point(i, j)); + } catch (StorageException e) { + throw new VizException( + "Error reading data to draw: ", e); } + + tilesToCreate.add(new Point(i, j)); } } } @@ -507,15 +492,13 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { for (int i = 0; i < tiles.length; i++) { for (int j = 0; j < tiles[i].length; j++) { ImageTile tile = tiles[i][j]; - if (tile != null && tile.occlude == false) { - - if (tile.coverage != null - && tile.coverage.intersects(paintProps.getView() - .getExtent()) - && tile.coverage.intersects(paintProps - .getClippingPane())) { - intersectedTiles.add(tile); - } + if (tile != null + && tile.coverage != null + && tile.coverage.intersects(paintProps.getView() + .getExtent()) + && tile.coverage.intersects(paintProps + .getClippingPane())) { + intersectedTiles.add(tile); } } } @@ -553,11 +536,10 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { needDrawLower = true; if (tile.coverage != null && tile.coverage.getMesh() == null) { - IMesh mesh = target.getExtension(IMapMeshExtension.class) - .constructMesh(mapDescriptor); - MeshCalculatorJob.getInstance().requestLoad(this, mesh, - tile, this.localProjToLL); - + tile.coverage.setMesh(target.getExtension( + IMapMeshExtension.class) + .constructMesh(tile.imageGeometry, + mapDescriptor.getGridGeometry())); target.setNeedsRefresh(true); } } @@ -695,6 +677,7 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { } public void init(IGraphicsTarget target) throws VizException { + disposed = false; this.lastPaintedTarget = target; if (this.sharedGeometryTileSet == null) { @@ -740,7 +723,6 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { this.originalGridGeometry = sharedGeometryTileset.originalGridGeometry; this.originalMathTransform = sharedGeometryTileset.originalMathTransform; this.cellOrientation = sharedGeometryTileset.cellOrientation; - this.graphicsAdapter = sharedGeometryTileset.graphicsAdapter; } public void reproject() throws VizException { @@ -811,6 +793,7 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { continue; } + ReferencedEnvelope envelope = tile.getEnvelope(); if (sharedGeometryTileSet != null && sharedGeometryTileSet.tileSet != tileSet) { ImageTile baseTile = sharedGeometryTileSet.tileSet @@ -823,9 +806,8 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { double[] ur = new double[2]; try { - ReferencedEnvelope envelope = ((ReferencedEnvelope) tile.envelope) - .transform(mapDescriptor.getCRS(), - false); + envelope = envelope.transform( + mapDescriptor.getCRS(), false); ll[0] = envelope.getMinX(); ll[1] = envelope.getMinY(); @@ -878,11 +860,9 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { tile.coverage = new PixelCoverage(ulc, urc, lrc, llc); } - } else { - if (tile.envelope != null) { - tile.coverage = mapDescriptor - .worldToPixel(tile.envelope); - } + } else if (envelope != null) { + tile.coverage = mapDescriptor + .worldToPixel(envelope); } } @@ -938,7 +918,7 @@ public abstract class AbstractTileSet implements IRenderable, IMeshCallback { for (int i = 0; i < tiles.length; i++) { for (int j = 0; j < tiles[0].length; j++) { ImageTile tile = tiles[i][j]; - if (tile != null && tile.envelope.contains(out[0], out[1])) { + if (tile != null && tile.contains(out[0], out[1])) { int coordX = (int) (outCoords[0]); int coordY = (int) (outCoords[1]); diff --git a/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/hdf5/FileBasedTileSet.java b/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/hdf5/FileBasedTileSet.java index f2427fd945..c12bcc09a8 100644 --- a/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/hdf5/FileBasedTileSet.java +++ b/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/hdf5/FileBasedTileSet.java @@ -111,8 +111,8 @@ public class FileBasedTileSet extends AbstractTileSet { .initializeRaster( new HDF5DataRetriever(new File(this.hdf5File), "/" + this.group + "/" + this.dataset - + "-interpolated/" + level, - this.tileSet.getTile(level, i, j).rect), + + "-interpolated/" + level, this.tileSet + .getTile(level, i, j).getRectangle()), rsc.getCapability(ColorMapCapability.class) .getColorMapParameters()); return raster; diff --git a/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/hdf5/MemoryBasedTileSet.java b/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/hdf5/MemoryBasedTileSet.java index 525adc3c2c..3768231f00 100644 --- a/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/hdf5/MemoryBasedTileSet.java +++ b/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/hdf5/MemoryBasedTileSet.java @@ -172,8 +172,8 @@ public class MemoryBasedTileSet extends AbstractTileSet { protected IImage createTile(IGraphicsTarget target, int level, int i, int j) throws VizException { IDataPreparer preparer = CMDataPreparerManager.getDataPreparer( - loadedData[level], this.tileSet.getTile(level, i, j).rect, - dims[level]); + loadedData[level], this.tileSet.getTile(level, i, j) + .getRectangle(), dims[level]); return target.initializeRaster(preparer, rsc.getCapability(ColorMapCapability.class) .getColorMapParameters()); diff --git a/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/jts/JTSCompiler.java b/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/jts/JTSCompiler.java index 41d7e694bb..6937def7b6 100644 --- a/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/jts/JTSCompiler.java +++ b/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/rsc/jts/JTSCompiler.java @@ -22,12 +22,12 @@ package com.raytheon.viz.core.rsc.jts; import org.eclipse.swt.graphics.RGB; import com.raytheon.uf.common.geospatial.ReferencedGeometry; +import com.raytheon.uf.common.geospatial.util.WorldWrapCorrector; import com.raytheon.uf.viz.core.drawables.IDescriptor; import com.raytheon.uf.viz.core.drawables.IShadedShape; import com.raytheon.uf.viz.core.drawables.IWireframeShape; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.IMapDescriptor; -import com.raytheon.uf.viz.core.map.WorldWrapCorrector; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; @@ -107,7 +107,8 @@ public class JTSCompiler { this.descriptor = descriptor; this.pointStyle = pointStyle; if (descriptor instanceof IMapDescriptor) { - this.corrector = new WorldWrapCorrector((IMapDescriptor) descriptor); + this.corrector = new WorldWrapCorrector( + descriptor.getGridGeometry()); } } diff --git a/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/topo/TopoTileSet.java b/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/topo/TopoTileSet.java index e94e0915a1..9b067b418b 100644 --- a/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/topo/TopoTileSet.java +++ b/cave/com.raytheon.viz.core/src/com/raytheon/viz/core/topo/TopoTileSet.java @@ -142,7 +142,8 @@ public class TopoTileSet extends FileBasedTileSet { return target.getExtension(IColormappedImageExtension.class) .initializeRaster( new HDF5DataRetriever(new File(this.hdf5File), dataset, - this.tileSet.getTile(level, i, j).rect), + this.tileSet.getTile(level, i, j) + .getRectangle()), rsc.getCapability(ColorMapCapability.class) .getColorMapParameters()); } diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/GribRequestableLevelNode.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/GribRequestableLevelNode.java index 3b3dfbf3d1..d3017cd74d 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/GribRequestableLevelNode.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/GribRequestableLevelNode.java @@ -116,7 +116,8 @@ public class GribRequestableLevelNode extends AbstractRequestableLevelNode { } @Override - public Set timeQueryInternal(boolean latestOnly, + public Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { @@ -145,7 +146,8 @@ public class GribRequestableLevelNode extends AbstractRequestableLevelNode { * getTimeQueryInternal(boolean, java.util.Map) */ @Override - protected TimeQueryRequest getTimeQueryInternal(boolean latestOnly, + protected TimeQueryRequest getTimeQueryInternal( + TimeQueryRequest originalRequest, boolean latestOnly, Map> cache) throws VizException { Set resultsSet = GribTimeCache.getInstance().getTimes(this); diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/ImportLevelNode.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/ImportLevelNode.java index 097b4f1832..14bc0db057 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/ImportLevelNode.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/ImportLevelNode.java @@ -31,6 +31,7 @@ import java.util.TreeSet; import com.raytheon.uf.common.dataplugin.grib.util.GribModelLookup; import com.raytheon.uf.common.dataplugin.grib.util.GridModel; import com.raytheon.uf.common.dataplugin.level.Level; +import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.catalog.LayerProperty; import com.raytheon.uf.viz.core.exception.VizException; @@ -148,7 +149,8 @@ public class ImportLevelNode extends AbstractAliasLevelNode { } @Override - public Set timeQueryInternal(boolean latestOnly, + public Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { @@ -158,7 +160,8 @@ public class ImportLevelNode extends AbstractAliasLevelNode { // then see what is available in the imported source, use time // interpolation to verify what data can be achieved NavigableSet sourceDataTimes = new TreeSet( - sourceNode.timeQuery(latestOnly, cache, latestOnlyCache)); + sourceNode.timeQuery(originalRequest, latestOnly, cache, + latestOnlyCache)); GridModel sourceModel = GribModelLookup.getInstance().getModelByName( sourceNodeModelName); long sourceDt = 0; diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/RadarRequestableLevelNode.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/RadarRequestableLevelNode.java index 443708f14e..371fc5cc46 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/RadarRequestableLevelNode.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/inv/RadarRequestableLevelNode.java @@ -121,7 +121,8 @@ public class RadarRequestableLevelNode extends AbstractRequestableLevelNode { } @Override - public Set timeQueryInternal(boolean latestOnly, + public Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { @@ -147,7 +148,8 @@ public class RadarRequestableLevelNode extends AbstractRequestableLevelNode { } @Override - protected TimeQueryRequest getTimeQueryInternal(boolean latestOnly, + protected TimeQueryRequest getTimeQueryInternal( + TimeQueryRequest originalRequest, boolean latestOnly, Map> cache) throws VizException { // TODO Auto-generated method stub diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridResource.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridResource.java index 466f9c7156..cf12ce05cf 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridResource.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/rsc/GridResource.java @@ -408,7 +408,7 @@ public class GridResource extends for (int j = 0; j < tiles[0].length; j++) { ImageTile tile = tiles[i][j]; if (tile != null - && tile.envelope.contains(envelopeCoordinates[0], + && tile.contains(envelopeCoordinates[0], envelopeCoordinates[1])) { int coordX = (int) (imageCoordinates[0]); int coordY = (int) (imageCoordinates[1]); diff --git a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GribDataCubeAdapter.java b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GribDataCubeAdapter.java index 96936a68e1..dd2e5c7bc6 100644 --- a/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GribDataCubeAdapter.java +++ b/cave/com.raytheon.viz.grid/src/com/raytheon/viz/grid/util/GribDataCubeAdapter.java @@ -24,30 +24,19 @@ import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.regex.Pattern; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.PluginException; -import com.raytheon.uf.common.dataplugin.grib.GribModel; import com.raytheon.uf.common.dataplugin.grib.GribRecord; -import com.raytheon.uf.common.dataquery.requests.DbQueryRequest; -import com.raytheon.uf.common.dataquery.requests.DbQueryRequestSet; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; -import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType; -import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; -import com.raytheon.uf.common.dataquery.requests.TimeQueryRequestSet; -import com.raytheon.uf.common.dataquery.responses.DbQueryResponse; -import com.raytheon.uf.common.dataquery.responses.DbQueryResponseSet; import com.raytheon.uf.common.datastorage.DataStoreFactory; import com.raytheon.uf.common.datastorage.IDataStore; import com.raytheon.uf.common.datastorage.Request; @@ -55,22 +44,20 @@ import com.raytheon.uf.common.datastorage.records.FloatDataRecord; import com.raytheon.uf.common.datastorage.records.IDataRecord; import com.raytheon.uf.common.geospatial.ISpatialEnabled; import com.raytheon.uf.common.geospatial.ISpatialObject; -import com.raytheon.uf.common.pointdata.PointDataContainer; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; +import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.HDF5Util; import com.raytheon.uf.viz.core.catalog.LayerProperty; import com.raytheon.uf.viz.core.datastructure.CubeUtil; -import com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter; import com.raytheon.uf.viz.core.datastructure.VizDataCubeException; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.requests.ThriftClient; +import com.raytheon.uf.viz.derivparam.data.AbstractDataCubeAdapter; import com.raytheon.uf.viz.derivparam.data.AbstractRequestableData; import com.raytheon.uf.viz.derivparam.library.DerivedParameterGenerator; import com.raytheon.uf.viz.derivparam.tree.AbstractRequestableLevelNode; -import com.raytheon.uf.viz.derivparam.tree.AbstractRequestableLevelNode.Dependency; import com.raytheon.viz.grid.data.GribRequestableData; import com.raytheon.viz.grid.inv.GridInventory; import com.raytheon.viz.grid.record.RequestableDataRecord; @@ -90,209 +77,16 @@ import com.raytheon.viz.grid.record.RequestableDataRecord; * @author brockwoo * @version 1.0 */ -public class GribDataCubeAdapter implements IDataCubeAdapter { +public class GribDataCubeAdapter extends AbstractDataCubeAdapter { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(GribDataCubeAdapter.class); - private static final String DERIVED = "DERIVED"; + public GribDataCubeAdapter() { + super(new String[] { "grib" }); + } private GridInventory gridInventory; - protected void getTimeQuery( - AbstractRequestableLevelNode req, - boolean latestOnly, - LinkedHashMap queries, - Map> cache, - Map> latestOnlyCache) - throws VizException { - List depends = req.getDependencies(); - if (depends.isEmpty()) { - // is source node - TimeQueryRequest myQ = req.getTimeQuery(latestOnly, cache, - latestOnlyCache); - if (myQ != null) { - // no need to merge timeQueries - queries.put(req, myQ); - } - } else { - for (Dependency dep : depends) { - // TODO: Optimize dTime/fTime to use bulk query mechanism, - // small case that is a not easy to get right with a bulk - // query - if (dep.timeOffset == 0 || !latestOnly) { - getTimeQuery(dep.node, latestOnly, queries, cache, - latestOnlyCache); - } - } - } - } - - @Override - public String[] getSupportedPlugins() { - return new String[] { "grib" }; - } - - @Override - public String recordKeyGenerator(PluginDataObject pdo) { - if (pdo instanceof GribRecord) { - GribModel modelInfo = ((GribRecord) pdo).getModelInfo(); - return DERIVED + modelInfo.getModelName() - + modelInfo.getParameterName() + modelInfo.getLevelName() - + modelInfo.getLevelInfo() + pdo.getDataTime().toString(); - } - return null; - } - - @Override - public IDataRecord[] getRecord(PluginDataObject obj) - throws VizDataCubeException { - return getRecord(obj, Request.ALL, null); - - } - - @Override - public List getData(LayerProperty property, int timeOut) - throws VizException { - List requests = gridInventory - .evaluateRequestConstraints(property - .getEntryQueryParameters(false)); - int mapSize = (int) (requests.size() * 1.25) + 1; - Map> cache = new HashMap>( - mapSize); - LinkedHashMap queries = new LinkedHashMap( - mapSize); - for (AbstractRequestableLevelNode req : requests) { - getDataQuery(req, property, timeOut, queries, cache); - } - DbQueryRequestSet reqSet = new DbQueryRequestSet(); - reqSet.setQueries(queries.values().toArray( - new DbQueryRequest[queries.size()])); - DbQueryResponseSet qSetResponse = (DbQueryResponseSet) ThriftClient - .sendRequest(reqSet); - DbQueryResponse[] qResponses = qSetResponse.getResults(); - int index = 0; - for (AbstractRequestableLevelNode node : queries.keySet()) { - // put results into cache - node.setDataQueryResults(qResponses[index++], cache); - } - - // pull the actual results from the cache - List requesters = new ArrayList( - requests.size()); - for (AbstractRequestableLevelNode request : requests) { - requesters.addAll(request.getData(property, timeOut, cache)); - } - - List results = new ArrayList(requesters.size()); - - for (AbstractRequestableData requester : requesters) { - if (requester.getDataTime() == null) { - DataTime[] entryTime = property.getSelectedEntryTime(); - if (entryTime != null && entryTime.length > 0) { - List entryTimes = new ArrayList( - Arrays.asList(entryTime)); - for (DataTime time : entryTimes) { - GribRecord rec = new RequestableDataRecord(requester); - rec.setDataTime(time.clone()); - try { - rec.setDataURI(null); - rec.constructDataURI(); - } catch (PluginException e) { - throw new VizException(e); - } - boolean n = true; - for (Object result : results) { - if (((GribRecord) result).getDataURI().equals( - rec.getDataURI())) { - n = false; - } - } - if (n) { - results.add(rec); - } - } - } else { - GribRecord rec = new RequestableDataRecord(requester); - rec.setDataTime(new DataTime(Calendar.getInstance())); - results.add(rec); - } - } else { - GribRecord rec = new RequestableDataRecord(requester); - results.add(rec); - } - } - if (property.getEntryQueryParameters(false).containsKey( - GridInventory.PERT_QUERY)) { - String pert = property.getEntryQueryParameters(false) - .get(GridInventory.PERT_QUERY).getConstraintValue(); - if (pert != null) { - for (Object rec : results) { - ((GribRecord) rec).getModelInfo().setPerturbationNumber( - Integer.parseInt(pert)); - } - } - } - return results; - } - - protected void getDataQuery( - AbstractRequestableLevelNode req, - LayerProperty property, - int timeOut, - LinkedHashMap queries, - Map> cache) - throws VizException { - List depends = req.getDependencies(); - if (depends.isEmpty()) { - // is source node - DbQueryRequest myQ = req.getDataQuery(property, timeOut, cache); - if (myQ != null) { - addDataQuery(req, myQ, queries); - } - } else { - for (Dependency dep : depends) { - // TODO: Optimize dTime/fTime to use bulk query mechanism, - // small case that is a not easy to get right with a bulk - // query - if (dep.timeOffset == 0) { - getDataQuery(dep.node, property, timeOut, queries, cache); - } - } - } - } - - private void addDataQuery(AbstractRequestableLevelNode req, - DbQueryRequest query, - LinkedHashMap queries) { - DbQueryRequest curQuery = queries.get(req); - if (curQuery == null) { - queries.put(req, query); - } else { - // merge - // assume same DB, fields, etc, should only be different - // time constraints since its the same node - RequestConstraint curDTs = curQuery.getConstraints() - .get("dataTime"); - RequestConstraint myDTs = query.getConstraints().get("dataTime"); - if (curDTs != null && myDTs != null) { - // only merge if both require dataTimes, otherwise one - // would be constrained when it needs everything, also - // assuming both to be in lists and needing to be merged - curDTs.setConstraintType(ConstraintType.IN); - Pattern split = Pattern.compile(","); - - String[] curVals = split.split(curDTs.getConstraintValue()); - String[] myVals = split.split(myDTs.getConstraintValue()); - HashSet dups = new HashSet(curVals.length - + myVals.length); - dups.addAll(Arrays.asList(curVals)); - dups.addAll(Arrays.asList(myVals)); - curDTs.setConstraintValueList(dups.toArray(new String[dups - .size()])); - } - } - } - @Override public void initInventory() { if (gridInventory == null) { @@ -311,49 +105,15 @@ public class GribDataCubeAdapter implements IDataCubeAdapter { @Override public Object getInventory() { - if (gridInventory == null) { - GridInventory gridInventory = new GridInventory(); - try { - gridInventory.initTree(DerivedParameterGenerator - .getDerParLibrary()); - this.gridInventory = gridInventory; - } catch (VizException e) { - statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), - e); - } - } + initInventory(); return gridInventory; } - @Override - public PointDataContainer getPoints(String plugin, String[] parameters, - Map queryParams) { - // TODO Someday we should put objective analysis code - // into this area - return null; - } - - @Override - public PointDataContainer getPoints(String plugin, String[] parameters, - String levelKey, Map queryParams) { - // TODO Someday we should put objective analysis code - // into this area - return null; - } - @Override public IDataRecord[] getRecord(PluginDataObject obj, Request req, String dataset) throws VizDataCubeException { if (obj instanceof RequestableDataRecord) { - try { - getRecords(Arrays.asList(obj), req, dataset); - IDataRecord[] result = (IDataRecord[]) obj.getMessageData(); - obj.setMessageData(null); - return result; - } catch (VizException e) { - throw new VizDataCubeException("Error retrieving grid record.", - e); - } + return super.getRecord(obj, req, dataset); } try { IDataRecord record = null; @@ -609,78 +369,90 @@ public class GribDataCubeAdapter implements IDataCubeAdapter { references.clear(); } + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.derivparam.data.AbstractDataCubeAdapter# + * evaluateRequestConstraints(java.util.Map) + */ @Override - public List> getBaseUpdateConstraints( + protected List evaluateRequestConstraints( Map constraints) { - List> result = new ArrayList>( - 1); - result.add(constraints); - return result; + return gridInventory.evaluateRequestConstraints(constraints); } + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.derivparam.data.AbstractDataCubeAdapter#timeAgnosticQuery + * (java.util.Map) + */ @Override - public List> timeQuery(List requests) - throws VizException { - int mapSize = (int) (requests.size() * 1) + 1; - Map> cache = new HashMap>( - mapSize); - LinkedHashMap queries = new LinkedHashMap( - mapSize); + protected List timeAgnosticQuery( + Map queryTerms) throws VizException { + return gridInventory.timeAgnosticQuery(queryTerms); + } - for (TimeQueryRequest request : requests) { - List requestNodes = gridInventory - .evaluateRequestConstraints(request.getQueryTerms()); - // pull out time queries and bulk submit - for (AbstractRequestableLevelNode requestNode : requestNodes) { - getTimeQuery(requestNode, false, queries, cache, null); + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.derivparam.data.AbstractDataCubeAdapter#getData(java + * .util.List) + */ + @Override + protected List getData(LayerProperty property, + List requesters) throws VizException { + List results = new ArrayList(requesters.size()); + for (AbstractRequestableData requester : requesters) { + if (requester.getDataTime() == null) { + DataTime[] entryTime = property.getSelectedEntryTime(); + if (entryTime != null && entryTime.length > 0) { + List entryTimes = new ArrayList( + Arrays.asList(entryTime)); + for (DataTime time : entryTimes) { + GribRecord rec = new RequestableDataRecord(requester); + rec.setDataTime(time.clone()); + try { + rec.setDataURI(null); + rec.constructDataURI(); + } catch (PluginException e) { + throw new VizException(e); + } + boolean n = true; + for (Object result : results) { + if (((GribRecord) result).getDataURI().equals( + rec.getDataURI())) { + n = false; + } + } + if (n) { + results.add(rec); + } + } + } else { + GribRecord rec = new RequestableDataRecord(requester); + rec.setDataTime(new DataTime(Calendar.getInstance())); + results.add(rec); + } + } else { + GribRecord rec = new RequestableDataRecord(requester); + results.add(rec); } } - - // set the results back into the cache's - TimeQueryRequestSet reqSet = new TimeQueryRequestSet(); - reqSet.setRequests(queries.values().toArray( - new TimeQueryRequest[queries.size()])); - @SuppressWarnings("unchecked") - List> qResponses = (List>) ThriftClient - .sendRequest(reqSet); - int index = 0; - for (AbstractRequestableLevelNode node : queries.keySet()) { - // put results into cache - node.setTimeQueryResults(false, qResponses.get(index++), cache, - null); - } - List> finalResponse = new ArrayList>( - requests.size()); - for (TimeQueryRequest request : requests) { - List requestNodes = gridInventory - .evaluateRequestConstraints(request.getQueryTerms()); - // pull the actual results from the cache - Set results = new HashSet(64); - for (AbstractRequestableLevelNode requestNode : requestNodes) { - Set times = requestNode.timeQuery(false, cache, null); - if (times == AbstractRequestableLevelNode.TIME_AGNOSTIC) { - // TODO: include time agnostic query in main bulk query as - // each - // pressure level will cause a separate query - List temp = gridInventory - .timeAgnosticQuery(request.getQueryTerms()); - if (temp != null) { - results.addAll(temp); - } - break; - } else { - results.addAll(times); + if (property.getEntryQueryParameters(false).containsKey( + GridInventory.PERT_QUERY)) { + String pert = property.getEntryQueryParameters(false) + .get(GridInventory.PERT_QUERY).getConstraintValue(); + if (pert != null) { + for (Object rec : results) { + ((GribRecord) rec).getModelInfo().setPerturbationNumber( + Integer.parseInt(pert)); } } - if (!request.isMaxQuery() || results.isEmpty()) { - finalResponse.add(new ArrayList(results)); - } else { - ArrayList response = new ArrayList(results); - Collections.sort(response); - finalResponse - .add(Arrays.asList(response.get(response.size() - 1))); - } } - return finalResponse; + return results; } + } diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotModelGeneratorJob.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotModelGeneratorJob.java index f71bb2deba..9b9ad1c25d 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotModelGeneratorJob.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/PlotModelGeneratorJob.java @@ -21,7 +21,6 @@ package com.raytheon.viz.pointdata; import java.awt.image.BufferedImage; import java.util.Map; -import java.util.UUID; import java.util.concurrent.ConcurrentLinkedQueue; import org.apache.commons.collections.map.LRUMap; @@ -33,8 +32,8 @@ import org.eclipse.core.runtime.jobs.Job; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.data.prep.IODataPreparer; import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.drawables.ext.ISingleColorImageExtension; /** * Job separated from PlotModelGenerator2 that creates the plot images. @@ -102,8 +101,9 @@ public class PlotModelGeneratorJob extends Job { } } if (image == null) { - image = target.initializeRaster(new IODataPreparer( - bImage, UUID.randomUUID().toString(), 0), null); + image = target.getExtension( + ISingleColorImageExtension.class) + .constructImage(bImage, null); if (plotCreator.isCachingImages()) { imageCache.put(bImage, image); } diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/drawables/GeneralPointImageExtension.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/drawables/GeneralPointImageExtension.java index 748a6216e9..1a81bb63d1 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/drawables/GeneralPointImageExtension.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/drawables/GeneralPointImageExtension.java @@ -62,7 +62,7 @@ public class GeneralPointImageExtension extends @Override public int getCompatibilityValue(IGraphicsTarget target) { - return Compatibilty.GENERIC.value; + return Compatibilty.GENERIC; } @Override diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/drawables/IPointImageExtension.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/drawables/IPointImageExtension.java index cba8abb754..e164e01300 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/drawables/IPointImageExtension.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/drawables/IPointImageExtension.java @@ -25,6 +25,7 @@ import com.raytheon.uf.viz.core.IGraphicsTarget.HorizontalAlignment; import com.raytheon.uf.viz.core.IGraphicsTarget.VerticalAlignment; import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface; import com.raytheon.uf.viz.core.exception.VizException; import com.vividsolutions.jts.geom.Coordinate; @@ -46,7 +47,7 @@ import com.vividsolutions.jts.geom.Coordinate; * @version 1.0 */ -public interface IPointImageExtension { +public interface IPointImageExtension extends IGraphicsExtensionInterface { public static class PointImage { diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/PlotResource2.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/PlotResource2.java index c531924211..a1f15de6e8 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/PlotResource2.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/rsc/PlotResource2.java @@ -48,7 +48,7 @@ import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.PixelExtent; import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.drawables.SingleColorImage; +import com.raytheon.uf.viz.core.drawables.ext.ISingleColorImageExtension.ISingleColorImage; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.jobs.JobPool; import com.raytheon.uf.viz.core.map.MapDescriptor; @@ -222,7 +222,7 @@ public class PlotResource2 extends continue; } // set image color so shader can draw in appropriate color - ((SingleColorImage) station.plotImage.getImage()) + ((ISingleColorImage) station.plotImage.getImage()) .setColor(imageColor); images.add(station.plotImage); } @@ -639,7 +639,7 @@ public class PlotResource2 extends Station s = frameInfo.stationMap.get(key[0].stationId); if (s != null) { if (image != null) { - SingleColorImage si = new SingleColorImage(image); + ISingleColorImage si = (ISingleColorImage) image; s.plotImage = new PointImage(si, s.pixelLocation); s.plotImage.setSiteId(s.info[0].stationId); si.setColor(imageColor); diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/HeightOfLevelNode.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/HeightOfLevelNode.java index 38d2f329d4..42049dbc32 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/HeightOfLevelNode.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/HeightOfLevelNode.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Set; import com.raytheon.uf.common.dataplugin.level.Level; +import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.catalog.LayerProperty; import com.raytheon.uf.viz.core.exception.VizException; @@ -125,7 +126,8 @@ public class HeightOfLevelNode extends AbstractDerivedLevelNode { * timeQueryInternal(boolean, java.util.Map) */ @Override - protected Set timeQueryInternal(boolean latestOnly, + protected Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointAccumLevelNode.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointAccumLevelNode.java index 75d5305eee..97ba8f5800 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointAccumLevelNode.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointAccumLevelNode.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.catalog.LayerProperty; import com.raytheon.uf.viz.core.exception.VizException; @@ -121,7 +122,8 @@ public class PointAccumLevelNode extends AbstractDerivedLevelNode { * timeQueryInternal(boolean, java.util.Map) */ @Override - protected Set timeQueryInternal(boolean latestOnly, + protected Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointDataCubeAdapter.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointDataCubeAdapter.java index 3203d28b3b..597365dc22 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointDataCubeAdapter.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointDataCubeAdapter.java @@ -320,19 +320,6 @@ public class PointDataCubeAdapter implements IDataCubeAdapter { } } - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#recordKeyGenerator - * (com.raytheon.uf.common.dataplugin.PluginDataObject) - */ - @Override - public String recordKeyGenerator(PluginDataObject pdo) { - // TODO Auto-generated method stub - return null; - } - @Override public IDataRecord[] getRecord(PluginDataObject obj, Request req, String dataset) throws VizDataCubeException { diff --git a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointDataLevelNode.java b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointDataLevelNode.java index 860718a23c..6a12f9e190 100644 --- a/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointDataLevelNode.java +++ b/cave/com.raytheon.viz.pointdata/src/com/raytheon/viz/pointdata/util/PointDataLevelNode.java @@ -120,7 +120,8 @@ public class PointDataLevelNode extends AbstractRequestableLevelNode { } @Override - protected TimeQueryRequest getTimeQueryInternal(boolean latestOnly, + protected TimeQueryRequest getTimeQueryInternal( + TimeQueryRequest originalRequest, boolean latestOnly, Map> cache) throws VizException { throw new UnsupportedOperationException( @@ -145,7 +146,8 @@ public class PointDataLevelNode extends AbstractRequestableLevelNode { * timeQueryInternal(boolean, java.util.Map) */ @Override - protected Set timeQueryInternal(boolean latestOnly, + protected Set timeQueryInternal(TimeQueryRequest originalRequest, + boolean latestOnly, Map> cache, Map> latestOnlyCache) throws VizException { diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/AbstractRadarResource.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/AbstractRadarResource.java index 6d0cf489c9..ecd49dd71a 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/AbstractRadarResource.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/AbstractRadarResource.java @@ -302,8 +302,16 @@ public class AbstractRadarResource extends if (resourceData.mode.equals("CZ-Pg")) { return null; } + + // Grab current time + DataTime displayedDate = descriptor.getTimeForResource(this); + + if (displayedDate == null) { + displayedDate = this.displayedDate; + } + try { - dataMap = interrogate(latLon.asLatLon()); + dataMap = interrogate(displayedDate, latLon.asLatLon()); } catch (Exception e) { throw new VizException("Error converting coordinate for hover", e); } @@ -333,20 +341,23 @@ public class AbstractRadarResource extends boolean visible = descriptor.getRenderableDisplay().getContainer() .getActiveDisplayPane().getDescriptor() == descriptor; if (visible && primary) { - return "=" + inspect(primaryInspectLabels, dataMap); + return "=" + + inspect(displayedDate, primaryInspectLabels, dataMap); } else { - return " " + inspect(offscreenInspectLabels, dataMap); + return " " + + inspect(displayedDate, offscreenInspectLabels, + dataMap); } } else if (primary) { - return inspect(dataMap); + return inspect(displayedDate, dataMap); } else { // The secondary returns slightly less data - return inspect(secondaryInspectLabels, dataMap); + return inspect(displayedDate, secondaryInspectLabels, dataMap); } } - public String inspect(Map dataMap) { - return inspect(defaultInspectLabels, dataMap); + public String inspect(DataTime dataTime, Map dataMap) { + return inspect(dataTime, defaultInspectLabels, dataMap); } /** @@ -355,7 +366,7 @@ public class AbstractRadarResource extends * @param dataMap * @return */ - public String inspect(List labels, + public String inspect(DataTime dataTime, List labels, Map dataMap) { if (dataMap == null) { return "NO DATA"; @@ -416,8 +427,13 @@ public class AbstractRadarResource extends public Map interrogate(ReferencedCoordinate coord) throws VizException { try { - return new HashMap(this.interrogate(coord - .asLatLon())); + DataTime displayedDate = descriptor.getTimeForResource(this); + + if (displayedDate == null) { + displayedDate = this.displayedDate; + } + return new HashMap(interrogate(displayedDate, + coord.asLatLon())); } catch (TransformException e) { throw new VizException( "Transformation error creating lat/lon from referenced coordinate", @@ -428,7 +444,7 @@ public class AbstractRadarResource extends } } - public Map interrogate(Coordinate latLon) { + public Map interrogate(DataTime dataTime, Coordinate latLon) { if (interrogator == null) { return new HashMap(); } @@ -438,13 +454,7 @@ public class AbstractRadarResource extends .getColorMapParameters(); } - DataTime displayedDate = descriptor.getTimeForResource(this); - - if (displayedDate == null) { - displayedDate = this.displayedDate; - } - - VizRadarRecord radarRecord = getRadarRecord(displayedDate); + VizRadarRecord radarRecord = getRadarRecord(dataTime); if (radarRecord != null && radarRecord.getStoredDataAsync() != null) { return interrogator.sample(radarRecord, latLon, params); } diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/RadarImageResource.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/RadarImageResource.java index da10c1e912..7b5ad69540 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/RadarImageResource.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/RadarImageResource.java @@ -31,13 +31,9 @@ import javax.measure.converter.MultiplyConverter; import javax.measure.converter.UnitConverter; import javax.measure.unit.Unit; -import org.geotools.coverage.grid.GridGeometry2D; -import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.referencing.CRS; -import org.geotools.referencing.crs.DefaultGeographicCRS; import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; -import org.opengis.referencing.datum.PixelInCell; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.TransformException; @@ -57,6 +53,7 @@ import com.raytheon.uf.viz.core.IMeshCallback; import com.raytheon.uf.viz.core.PixelCoverage; import com.raytheon.uf.viz.core.VizApp; import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; +import com.raytheon.uf.viz.core.drawables.ColorMapLoader; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.IDescriptor; import com.raytheon.uf.viz.core.drawables.IImage; @@ -70,7 +67,6 @@ import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; import com.raytheon.uf.viz.core.rsc.capabilities.OutlineCapability; import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; -import com.raytheon.uf.viz.core.rsc.hdf5.MeshCalculatorJob; import com.raytheon.uf.viz.core.style.DataMappingPreferences; import com.raytheon.uf.viz.core.style.DataMappingPreferences.DataMappingEntry; import com.raytheon.viz.awipstools.capabilities.RangeRingsOverlayCapability; @@ -188,64 +184,16 @@ public class RadarImageResource extends ColorMapParameters params = getColorMapParameters(target, populatedRecord); - ImageTile tile = new ImageTile(); - RadarRecord record = populatedRecord; - try { - // Attempt to create envelope, adapted from AbstractTileSet - double maxExtent = RadarUtil.calculateExtent(record); - GridGeometry2D geom = RadarUtil.constructGridGeometry( - record.getCRS(), maxExtent, - Math.max(record.getNumBins(), record.getNumRadials())); - - MathTransform mt = geom.getGridToCRS(PixelInCell.CELL_CORNER); - - double[] ul = new double[3]; - double[] lr = new double[3]; - double[] in = new double[2]; - in[0] = 0; - in[1] = 0; - mt.transform(in, 0, ul, 0, 1); - in[0] = record.getNumRadials(); - in[1] = record.getNumBins(); - mt.transform(in, 0, lr, 0, 1); - - tile.envelope = new ReferencedEnvelope(ul[0], lr[0], ul[1], lr[1], - record.getCRS()); - } catch (Exception e) { - statusHandler.handle(Priority.PROBLEM, "Error constructing extent", - e); + PixelCoverage coverage = buildCoverage(target, populatedRecord); + if (coverage.getMesh() == null) { + coverage.setMesh(buildMesh(target, populatedRecord)); } - tile.rect = new Rectangle(0, 0, populatedRecord.getNumBins(), - populatedRecord.getNumRadials()); - - if (tile.coverage == null) { - tile.coverage = buildCoverage(target, tile, populatedRecord); - } - - if (tile.coverage.getMesh() == null) { - IMesh mesh = buildMesh(target, populatedRecord); - - if (mesh != null) { - try { - MeshCalculatorJob.getInstance().requestLoad( - this, - mesh, - tile, - CRS.findMathTransform(populatedRecord.getCRS(), - DefaultGeographicCRS.WGS84)); - } catch (FactoryException e) { - statusHandler - .handle(Priority.PROBLEM, - "Error finding math transform to lat/lon for radar record", - e); - } - } - } - - IImage image = createImage(target, params, record, tile.rect); + IImage image = createImage(target, params, populatedRecord, + new Rectangle(0, 0, populatedRecord.getNumBins(), + populatedRecord.getNumRadials())); DrawableImage dImage = images.put(populatedRecord.getDataTime(), - new DrawableImage(image, tile.coverage)); + new DrawableImage(image, coverage)); if (dImage != null) { disposeImage(dImage); } @@ -322,7 +270,7 @@ public class RadarImageResource extends colorMapName = "Radar/OSF/16 Level Reflectivity"; } - params.setColorMap(target.buildColorMap(colorMapName)); + params.setColorMap(ColorMapLoader.loadColorMap(colorMapName)); } @@ -408,40 +356,55 @@ public class RadarImageResource extends this.actualLevel = String.format("%1.1f", record.getTrueElevationAngle()); - try { - DrawableImage image = images.get(displayedDate); - if (image == null || image.getCoverage() == null) { - if (record.getStoredDataAsync() == null) { - issueRefresh(); - return; - } - createTile(target, record); - image = images.get(displayedDate); - } + DrawableImage image = getImage(target, displayedDate); + if (image != null) { + ImagingCapability cap = getCapability(ImagingCapability.class); + image.getImage().setBrightness(cap.getBrightness()); + image.getImage().setContrast(cap.getContrast()); + image.getImage().setInterpolated(cap.isInterpolationState()); + target.drawRasters(paintProps, image); + } - if (image != null) { - ImagingCapability cap = getCapability(ImagingCapability.class); - image.getImage().setBrightness(cap.getBrightness()); - image.getImage().setContrast(cap.getContrast()); - image.getImage() - .setInterpolated(cap.isInterpolationState()); - target.drawRasters(paintProps, image); - } - - if (image == null || image.getCoverage() == null - || image.getCoverage().getMesh() == null) { - issueRefresh(); - } - } catch (Exception e) { - String msg = e.getMessage(); - if (msg == null) { - msg = "Error rendering radar"; - } - throw new VizException(msg, e); + if (image == null || image.getCoverage() == null + || image.getCoverage().getMesh() == null) { + issueRefresh(); } } } + /** + * Get the radar image for the given time + * + * @param target + * @param dataTime + * @return + * @throws VizException + */ + public DrawableImage getImage(IGraphicsTarget target, DataTime dataTime) + throws VizException { + DrawableImage image = images.get(dataTime); + if (image == null || image.getCoverage() == null) { + VizRadarRecord record = getRadarRecord(dataTime); + if (record != null) { + if (record.getStoredDataAsync() == null) { + issueRefresh(); + } else { + try { + createTile(target, record); + image = images.get(dataTime); + } catch (Exception e) { + String msg = e.getMessage(); + if (msg == null) { + msg = "Error rendering radar"; + } + throw new VizException(msg, e); + } + } + } + } + return image; + } + /** * Shared by image and non-image * @@ -599,7 +562,7 @@ public class RadarImageResource extends return null; } - public PixelCoverage buildCoverage(IGraphicsTarget target, ImageTile tile, + public PixelCoverage buildCoverage(IGraphicsTarget target, VizRadarRecord timeRecord) throws VizException { return new PixelCoverage(new Coordinate(0, 0), 0, 0); } diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/IRadialMeshExtension.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/IRadialMeshExtension.java index c60d493c0f..dec8810bb7 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/IRadialMeshExtension.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/IRadialMeshExtension.java @@ -21,6 +21,7 @@ package com.raytheon.viz.radar.rsc.image; import com.raytheon.uf.common.dataplugin.radar.RadarRecord; import com.raytheon.uf.viz.core.IMesh; +import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.IMapDescriptor; @@ -41,7 +42,7 @@ import com.raytheon.uf.viz.core.map.IMapDescriptor; * @version 1.0 */ -public interface IRadialMeshExtension { +public interface IRadialMeshExtension extends IGraphicsExtensionInterface { /** * Construct a mesh to be used for the radar record on the descriptor diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/RadarRadialResource.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/RadarRadialResource.java index 45287dd648..2e2707fcb8 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/RadarRadialResource.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/RadarRadialResource.java @@ -29,6 +29,7 @@ import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; import com.raytheon.uf.common.dataplugin.radar.RadarRecord; +import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.viz.core.DrawableImage; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.IMesh; @@ -133,8 +134,8 @@ public class RadarRadialResource extends RadarImageResource { } @Override - public String inspect(Map dataMap) { - StringBuilder sb = new StringBuilder(super.inspect(dataMap)); + public String inspect(DataTime dataTime, Map dataMap) { + StringBuilder sb = new StringBuilder(super.inspect(dataTime, dataMap)); if (dataMap != null && dataMap.containsKey(EAV_VALUE)) { sb.append(" ").append(dataMap.get(EAV_VALUE)); @@ -143,8 +144,8 @@ public class RadarRadialResource extends RadarImageResource { } @Override - public Map interrogate(Coordinate latLon) { - Map dataMap = super.interrogate(latLon); + public Map interrogate(DataTime dataTime, Coordinate latLon) { + Map dataMap = super.interrogate(dataTime, latLon); // add EAV values to dataMap, if necessary if (hasCapability(EAVCapability.class)) { diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/RadarRasterResource.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/RadarRasterResource.java index 4e62cd31f0..d02f66b57b 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/RadarRasterResource.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/image/RadarRasterResource.java @@ -21,16 +21,13 @@ package com.raytheon.viz.radar.rsc.image; import java.awt.Rectangle; -import org.geotools.referencing.CRS; -import org.geotools.referencing.crs.DefaultGeographicCRS; -import org.opengis.referencing.FactoryException; +import org.geotools.coverage.grid.GridGeometry2D; import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.raytheon.uf.common.dataplugin.radar.RadarRecord; -import com.raytheon.uf.common.status.UFStatus.Priority; +import com.raytheon.uf.common.dataplugin.radar.util.RadarUtil; import com.raytheon.uf.viz.core.DrawableImage; import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.IMesh; import com.raytheon.uf.viz.core.PixelCoverage; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.IImage; @@ -39,7 +36,6 @@ import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.IMapMeshExtension; import com.raytheon.uf.viz.core.map.MapDescriptor; import com.raytheon.uf.viz.core.rsc.LoadProperties; -import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; import com.raytheon.viz.radar.VizRadarRecord; import com.raytheon.viz.radar.interrogators.IRadarInterrogator; import com.raytheon.viz.radar.rsc.RadarImageResource; @@ -85,22 +81,19 @@ public class RadarRasterResource extends RadarImageResource { } @Override - public PixelCoverage buildCoverage(IGraphicsTarget target, ImageTile tile, + public PixelCoverage buildCoverage(IGraphicsTarget target, VizRadarRecord timeRecord) throws VizException { if (sharedCoverage == null) { - sharedCoverage = super.buildCoverage(target, tile, timeRecord); + double maxExtent = RadarUtil.calculateExtent(timeRecord); + GridGeometry2D geom = RadarUtil.constructGridGeometry( + timeRecord.getCRS(), + maxExtent, + Math.max(timeRecord.getNumBins(), + timeRecord.getNumRadials())); - IMesh mesh = target.getExtension(IMapMeshExtension.class) - .constructMesh(descriptor); - try { - mesh.calculateMesh(sharedCoverage, tile, CRS.findMathTransform( - timeRecord.getCRS(), DefaultGeographicCRS.WGS84)); - } catch (FactoryException e) { - statusHandler - .handle(Priority.PROBLEM, - "Error finding math transform to lat/lon for radar record", - e); - } + sharedCoverage = super.buildCoverage(target, timeRecord); + sharedCoverage.setMesh(target.getExtension(IMapMeshExtension.class) + .constructMesh(geom, descriptor.getGridGeometry())); } return sharedCoverage; } @@ -115,17 +108,9 @@ public class RadarRasterResource extends RadarImageResource { @Override public void project(CoordinateReferenceSystem crs) throws VizException { super.project(crs); - if (sharedCoverage != null) { - sharedCoverage.dispose(); - sharedCoverage = null; + if (sharedCoverage != null && sharedCoverage.getMesh() != null) { + sharedCoverage.getMesh().reproject(descriptor.getGridGeometry()); } - // TODO dispose just the coverage, not the image. - for (DrawableImage image : images.values()) { - if (image != null) { - image.dispose(); - } - } - images.clear(); } @Override diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/MergeRasterRadarMosaicRenderer.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/MergeRasterRadarMosaicRenderer.java index dac7b28510..32407ba004 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/MergeRasterRadarMosaicRenderer.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/MergeRasterRadarMosaicRenderer.java @@ -41,7 +41,7 @@ import com.raytheon.uf.viz.core.rsc.AbstractVizResource; import com.raytheon.viz.core.rsc.BestResResource; import com.raytheon.viz.radar.rsc.MosaicPaintProperties; import com.raytheon.viz.radar.rsc.RadarImageResource; -import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicRendererFactoryExtension.IRadarMosaicRenderer; +import com.raytheon.viz.radar.rsc.mosaic.RadarMosaicRendererFactory.IRadarMosaicRenderer; import com.raytheon.viz.radar.util.DataUtilities; /** diff --git a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/RadarMosaicRenderer.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicRenderer.java similarity index 63% rename from cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/RadarMosaicRenderer.java rename to cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicRenderer.java index cbea81a810..e44bb780f5 100644 --- a/cave/com.raytheon.uf.viz.radar.gl/src/com/raytheon/uf/viz/radar/gl/mosaic/RadarMosaicRenderer.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicRenderer.java @@ -17,39 +17,36 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.uf.viz.radar.gl.mosaic; +package com.raytheon.viz.radar.rsc.mosaic; -import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.viz.core.DrawableImage; import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.PixelCoverage; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; -import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.drawables.ResourcePair; -import com.raytheon.uf.viz.core.drawables.ext.IOffscreenRenderingExtension; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.rsc.AbstractVizResource; import com.raytheon.uf.viz.core.rsc.IRefreshListener; import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; -import com.raytheon.uf.viz.radar.gl.MosaicGLTarget; -import com.raytheon.viz.core.gl.IGLTarget; import com.raytheon.viz.core.rsc.BestResResource; import com.raytheon.viz.radar.rsc.MosaicPaintProperties; import com.raytheon.viz.radar.rsc.RadarImageResource; -import com.raytheon.viz.radar.rsc.mosaic.RadarMosaicResource; -import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicRendererFactoryExtension.IRadarMosaicRenderer; +import com.raytheon.viz.radar.rsc.mosaic.RadarMosaicRendererFactory.IRadarMosaicRenderer; +import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicImageExtension; +import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicImageExtension.IMosaicImage; import com.vividsolutions.jts.geom.Coordinate; /** - * GL Mosaic rendering class using gl frame buffer objects and custom fragment - * shader. + * Radar Mosaic rendering class using IRadarMosaicImageExtension to render + * mosaic image * *
  * 
@@ -66,17 +63,9 @@ import com.vividsolutions.jts.geom.Coordinate;
 
 public class RadarMosaicRenderer implements IRadarMosaicRenderer,
         IRefreshListener {
-    private static final transient IUFStatusHandler statusHandler = UFStatus
-            .getHandler(RadarMosaicRenderer.class);
-
-    /** The current offscreen texture that is getting rendered to */
-    private static IImage currentWrite = null;
 
     /** This instances offscreen texture */
-    private IImage writeTo = null;
-
-    /** Bounds of the offscreen texture */
-    private int[] mosaicBounds = null;
+    private IMosaicImage writeTo = null;
 
     /** Last extent painted, if extent changes, repaint to texture */
     private IExtent lastExtent = null;
@@ -84,21 +73,6 @@ public class RadarMosaicRenderer implements IRadarMosaicRenderer,
     /** The coverage of the offscreen texture (used for drawing on screen) */
     private PixelCoverage writeToCoverage = null;
 
-    private IGraphicsTarget mosaicTarget = null;
-
-    private IGLTarget glTarget = null;
-
-    /**
-     * This function returns the current gl image that is being mosaic'd to. It
-     * depends on the fact that painting is a synchronous operation and no 2
-     * mosaics will be drawing at exactly the same time.
-     * 
-     * @return currently writing offscreen mosaic texture
-     */
-    public static IImage getCurrentMosaicImage() {
-        return currentWrite;
-    }
-
     /**
      * Default constructor, needed since class is instantiated through eclipse
      * extension point
@@ -124,13 +98,6 @@ public class RadarMosaicRenderer implements IRadarMosaicRenderer,
         ColorMapParameters params = mosaicToRender.getCapability(
                 ColorMapCapability.class).getColorMapParameters();
 
-        IGLTarget glTarget = (IGLTarget) target;
-
-        if (glTarget != this.glTarget) {
-            this.glTarget = glTarget;
-            this.mosaicTarget = new MosaicGLTarget(glTarget);
-        }
-
         // If first paint, initialize and wait for next paint
         if (writeTo == null) {
             init(target, paintProps, params);
@@ -142,13 +109,11 @@ public class RadarMosaicRenderer implements IRadarMosaicRenderer,
                 }
             }
             mosaicToRender.registerListener(this);
-        }
-
-        // If Window size changed, recreate the off screen buffer
-        if (Arrays.equals(
-                mosaicBounds,
+        } else if (Arrays.equals(
+                new int[] { writeTo.getWidth(), writeTo.getHeight() },
                 new int[] { paintProps.getCanvasBounds().width,
                         paintProps.getCanvasBounds().height }) == false) {
+            // If Window size changed, recreate the off screen buffer
             dispose();
             init(target, paintProps, params);
         }
@@ -158,29 +123,31 @@ public class RadarMosaicRenderer implements IRadarMosaicRenderer,
         synchronized (this) {
             if (props.isForceRepaint()
                     || paintProps.getView().getExtent().equals(lastExtent) == false) {
-                IOffscreenRenderingExtension offscreenExt = target
-                        .getExtension(IOffscreenRenderingExtension.class);
-                offscreenExt.renderOffscreen(writeTo);
-                try {
-                    currentWrite = writeTo;
-                    // paint radar using mosaic target
-                    for (ResourcePair rp : mosaicToRender.getResourceList()) {
-                        AbstractVizResource rsc = rp.getResource();
-                        DataTime time = mosaicToRender.getTimeForResource(rsc);
-                        if (rsc instanceof BestResResource) {
-                            rsc = ((BestResResource) rsc)
-                                    .getBestResResource(time);
-                        }
-                        if (rsc != null) {
-                            RadarImageResource rr = (RadarImageResource) rsc;
-                            paintProps.setDataTime(time);
-                            rr.paintRadar(mosaicTarget, paintProps);
+                List images = new ArrayList();
+
+                // paint radar using mosaic target
+                for (ResourcePair rp : mosaicToRender.getResourceList()) {
+                    AbstractVizResource rsc = rp.getResource();
+                    DataTime time = mosaicToRender.getTimeForResource(rsc);
+                    if (rsc instanceof BestResResource) {
+                        rsc = ((BestResResource) rsc).getBestResResource(time);
+                    }
+                    if (rsc != null && time != null) {
+                        RadarImageResource rr = (RadarImageResource) rsc;
+                        DrawableImage di = rr.getImage(target, time);
+                        if (di != null && di.getImage() != null
+                                && di.getCoverage() != null
+                                && di.getCoverage().getMesh() != null) {
+                            // If image is ready to go, add
+                            images.add(di);
+                        } else {
+                            mosaicToRender.issueRefresh();
                         }
                     }
-                } finally {
-                    offscreenExt.renderOnscreen();
                 }
 
+                writeTo.setImagesToMosaic(images
+                        .toArray(new DrawableImage[images.size()]));
                 lastExtent = paintProps.getView().getExtent().clone();
 
                 Coordinate ul = new Coordinate(lastExtent.getMinX(),
@@ -197,13 +164,10 @@ public class RadarMosaicRenderer implements IRadarMosaicRenderer,
 
             writeTo.setContrast(mosaicToRender.getCapability(
                     ImagingCapability.class).getContrast());
-
             writeTo.setBrightness(mosaicToRender.getCapability(
                     ImagingCapability.class).getBrightness());
 
             target.drawRaster(writeTo, writeToCoverage, paintProps);
-
-            currentWrite = null;
         }
     }
 
@@ -212,12 +176,11 @@ public class RadarMosaicRenderer implements IRadarMosaicRenderer,
      */
     private void init(IGraphicsTarget target, PaintProperties paintProps,
             ColorMapParameters params) throws VizException {
-        // Construct texture for offscreen rendering
-        mosaicBounds = new int[] { paintProps.getCanvasBounds().width,
-                paintProps.getCanvasBounds().height };
-        writeTo = target
-                .getExtension(IOffscreenRenderingExtension.class)
-                .constructOffscreenImage(ByteBuffer.class, mosaicBounds, params);
+        // Construct texture for mosaicing
+        writeTo = target.getExtension(IRadarMosaicImageExtension.class)
+                .initializeRaster(
+                        new int[] { paintProps.getCanvasBounds().width,
+                                paintProps.getCanvasBounds().height }, params);
     }
 
     @Override
diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/ext/IRadarMosaicRendererFactoryExtension.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicRendererFactory.java
similarity index 63%
rename from cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/ext/IRadarMosaicRendererFactoryExtension.java
rename to cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicRendererFactory.java
index 03a5043781..3feac88fd0 100644
--- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/ext/IRadarMosaicRendererFactoryExtension.java
+++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicRendererFactory.java
@@ -17,16 +17,14 @@
  * See the AWIPS II Master Rights File ("Master Rights File.pdf") for
  * further licensing information.
  **/
-package com.raytheon.viz.radar.rsc.mosaic.ext;
+package com.raytheon.viz.radar.rsc.mosaic;
 
 import com.raytheon.uf.viz.core.IGraphicsTarget;
 import com.raytheon.uf.viz.core.drawables.PaintProperties;
 import com.raytheon.uf.viz.core.exception.VizException;
-import com.raytheon.viz.radar.rsc.mosaic.RadarMosaicResource;
 
 /**
- * Mosaic Renderer factory extension. Implementers of this extension will
- * construct IRadarMosaicRenderers
+ * Radar mosaic renderer factory, creates mosaic renderers
  * 
  * 
  * 
@@ -42,7 +40,7 @@ import com.raytheon.viz.radar.rsc.mosaic.RadarMosaicResource;
  * @version 1.0
  */
 
-public interface IRadarMosaicRendererFactoryExtension {
+public class RadarMosaicRendererFactory {
 
     public static enum MosaicType {
         MergeRaster, MaxValue;
@@ -50,31 +48,23 @@ public interface IRadarMosaicRendererFactoryExtension {
 
     public static interface IRadarMosaicRenderer {
 
-        /**
-         * similar to the paint(...) call on IRenderable, this function tells
-         * the mosaic renderer to render the mosaic given the target,
-         * paintProperties, and mosaic resource
-         * 
-         * @param target
-         * @param paintProps
-         * @param mosaicToRender
-         * @throws VizException
-         */
         public void mosaic(IGraphicsTarget target, PaintProperties paintProps,
                 RadarMosaicResource mosaicToRender) throws VizException;
 
-        /**
-         * Dispose of any resources being used
-         */
         public void dispose();
+
     }
 
-    /**
-     * Create a new radar mosaic renderer
-     * 
-     * @return
-     */
-    public IRadarMosaicRenderer createNewRenderer(MosaicType mosaicType)
-            throws VizException;
+    public static IRadarMosaicRenderer createNewRenderer(MosaicType mosaicType)
+            throws VizException {
+        switch (mosaicType) {
+        case MergeRaster:
+            return new MergeRasterRadarMosaicRenderer();
+        case MaxValue:
+            return new RadarMosaicRenderer();
+        }
+        throw new VizException("Could not find mosaic renderer for type = "
+                + mosaicType);
+    }
 
 }
diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicResource.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicResource.java
index 79fbfd29d0..021cfcc55a 100644
--- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicResource.java
+++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicResource.java
@@ -60,8 +60,7 @@ import com.raytheon.viz.radar.rsc.AbstractRadarResource;
 import com.raytheon.viz.radar.rsc.MosaicPaintProperties;
 import com.raytheon.viz.radar.rsc.RadarImageResource;
 import com.raytheon.viz.radar.rsc.RadarTextResource.IRadarTextGeneratingResource;
-import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicRendererFactoryExtension;
-import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicRendererFactoryExtension.IRadarMosaicRenderer;
+import com.raytheon.viz.radar.rsc.mosaic.RadarMosaicRendererFactory.IRadarMosaicRenderer;
 import com.vividsolutions.jts.geom.Coordinate;
 
 /**
@@ -153,10 +152,8 @@ public class RadarMosaicResource extends
      */
     @Override
     protected void initInternal(IGraphicsTarget target) throws VizException {
-
-        mosaicRenderer = target.getExtension(
-                IRadarMosaicRendererFactoryExtension.class).createNewRenderer(
-                resourceData.getMosaicType());
+        mosaicRenderer = RadarMosaicRendererFactory
+                .createNewRenderer(resourceData.getMosaicType());
 
         // We want to init the most severe resource first so the colormap
         // matches.
@@ -229,11 +226,11 @@ public class RadarMosaicResource extends
         if (recordsToMosaic.isEmpty() == false) {
             DataTime curTime = getTimeForResource(this);
             synchronized (this) {
-                force = force || !curTime.equals(lastTime);
-                mosaicRenderer.mosaic(target, new MosaicPaintProperties(
-                        paintProps, force), this);
+                boolean forceIt = force || !curTime.equals(lastTime);
                 force = false;
                 lastTime = curTime;
+                mosaicRenderer.mosaic(target, new MosaicPaintProperties(
+                        paintProps, forceIt), this);
             }
 
         }
@@ -426,6 +423,8 @@ public class RadarMosaicResource extends
         } catch (Exception e) {
             // ignore
         }
+
+        Map, DataTime> rscTimeMap = new HashMap, DataTime>();
         Map, Map> rscInspectMap = new HashMap, Map>();
         AbstractRadarResource highestRsc = null;
         String inspectString = null;
@@ -442,6 +441,7 @@ public class RadarMosaicResource extends
                     if (rsc instanceof AbstractRadarResource) {
                         @SuppressWarnings("unchecked")
                         AbstractRadarResource rr = (AbstractRadarResource) rsc;
+                        rscTimeMap.put(rr, time);
                         try {
                             // Everything in this try block is to only sample
                             // records within range
@@ -478,8 +478,10 @@ public class RadarMosaicResource extends
             if (resources.isEmpty() && highestRsc != null) {
                 resources.add(highestRsc);
             }
+
             for (AbstractRadarResource rr : resources) {
-                Map vals = rr.interrogate(coord);
+                Map vals = rr.interrogate(rscTimeMap.get(rr),
+                        coord);
                 if (vals != null) {
                     rscInspectMap.put(rr, vals);
                 }
@@ -500,7 +502,8 @@ public class RadarMosaicResource extends
         }
 
         if (highestRsc != null) {
-            inspectString = highestRsc.inspect(rscInspectMap.get(highestRsc));
+            inspectString = highestRsc.inspect(rscTimeMap.get(highestRsc),
+                    rscInspectMap.get(highestRsc));
         }
         return inspectString == null ? "NO DATA" : inspectString;
     }
diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicResourceData.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicResourceData.java
index 85ae6a03b5..1cd2503287 100644
--- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicResourceData.java
+++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/RadarMosaicResourceData.java
@@ -48,7 +48,7 @@ import com.raytheon.uf.viz.core.rsc.AbstractResourceData;
 import com.raytheon.uf.viz.core.rsc.AbstractVizResource;
 import com.raytheon.uf.viz.core.rsc.LoadProperties;
 import com.raytheon.uf.viz.core.rsc.ResourceList;
-import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicRendererFactoryExtension.MosaicType;
+import com.raytheon.viz.radar.rsc.mosaic.RadarMosaicRendererFactory.MosaicType;
 
 /**
  * Provides the metadata and constructor for Radar
diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/ext/IRadarMosaicImageExtension.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/ext/IRadarMosaicImageExtension.java
new file mode 100644
index 0000000000..fe0ef14d81
--- /dev/null
+++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/mosaic/ext/IRadarMosaicImageExtension.java
@@ -0,0 +1,56 @@
+/**
+ * This software was developed and / or modified by Raytheon Company,
+ * pursuant to Contract DG133W-05-CQ-1067 with the US Government.
+ * 
+ * U.S. EXPORT CONTROLLED TECHNICAL DATA
+ * This software product contains export-restricted data whose
+ * export/transfer/disclosure is restricted by U.S. law. Dissemination
+ * to non-U.S. persons whether in the United States or abroad requires
+ * an export license or other authorization.
+ * 
+ * Contractor Name:        Raytheon Company
+ * Contractor Address:     6825 Pine Street, Suite 340
+ *                         Mail Stop B8
+ *                         Omaha, NE 68106
+ *                         402.291.0100
+ * 
+ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for
+ * further licensing information.
+ **/
+package com.raytheon.viz.radar.rsc.mosaic.ext;
+
+import com.raytheon.uf.viz.core.DrawableImage;
+import com.raytheon.uf.viz.core.drawables.ColorMapParameters;
+import com.raytheon.uf.viz.core.drawables.IImage;
+import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension;
+import com.raytheon.uf.viz.core.exception.VizException;
+
+/**
+ * Radar mosaic image extension, creates IMosaicImages
+ * 
+ * 
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Dec 16, 2011            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public interface IRadarMosaicImageExtension extends IImagingExtension { + + public static interface IMosaicImage extends IImage { + + public void setImagesToMosaic(DrawableImage... images); + + } + + public IMosaicImage initializeRaster(int[] imageBounds, + ColorMapParameters params) throws VizException; + +} diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/ui/xy/RadarXYResource.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/ui/xy/RadarXYResource.java index 5d8824d554..c41016fd04 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/ui/xy/RadarXYResource.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/ui/xy/RadarXYResource.java @@ -59,7 +59,6 @@ import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; import com.raytheon.uf.viz.core.rsc.capabilities.MagnificationCapability; import com.raytheon.uf.viz.core.rsc.capabilities.TimeMatchBasisCapability; -import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; import com.raytheon.viz.awipstools.capabilities.RangeRingsOverlayCapability; import com.raytheon.viz.core.contours.util.VectorGraphicsRenderable; import com.raytheon.viz.radar.RadarHelper; @@ -184,7 +183,7 @@ public class RadarXYResource extends RadarImageResource { * com.raytheon.viz.radar.RadarTimeRecord.RadarTiltRecord) */ @Override - public PixelCoverage buildCoverage(IGraphicsTarget target, ImageTile tile, + public PixelCoverage buildCoverage(IGraphicsTarget target, VizRadarRecord radarRecord) throws VizException { double width = radarRecord.getNumBins(); double height = radarRecord.getNumRadials(); diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/ui/xy/RadarXsectXYResource.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/ui/xy/RadarXsectXYResource.java index 7e4d677b84..b8f096de02 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/ui/xy/RadarXsectXYResource.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/ui/xy/RadarXsectXYResource.java @@ -40,7 +40,6 @@ import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.MapDescriptor; import com.raytheon.uf.viz.core.rsc.LoadProperties; import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability; -import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; import com.raytheon.uf.viz.xy.map.rsc.IInsetMapResource; import com.raytheon.viz.radar.VizRadarRecord; import com.raytheon.viz.radar.interrogators.IRadarInterrogator; @@ -181,7 +180,7 @@ public class RadarXsectXYResource extends RadarXYResource implements * com.raytheon.viz.radar.RadarTimeRecord.RadarTiltRecord) */ @Override - public PixelCoverage buildCoverage(IGraphicsTarget target, ImageTile tile, + public PixelCoverage buildCoverage(IGraphicsTarget target, VizRadarRecord rec) throws VizException { int iStart = rec.getIstart(); int jStart = rec.getJstart(); diff --git a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatBlendedResource.java b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatBlendedResource.java index 2579678a59..0363933567 100644 --- a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatBlendedResource.java +++ b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatBlendedResource.java @@ -149,10 +149,10 @@ public class SatBlendedResource extends @Override protected void paintInternal(IGraphicsTarget target, PaintProperties paintProps) throws VizException { - if (Arrays.equals( - imageBounds, - new int[] { paintProps.getCanvasBounds().width, - paintProps.getCanvasBounds().height }) == false) { + if (offscreenImage == null + || Arrays.equals(imageBounds, + new int[] { paintProps.getCanvasBounds().width, + paintProps.getCanvasBounds().height }) == false) { disposeImage(); initImage(target, paintProps); } diff --git a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatFileBasedTileSet.java b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatFileBasedTileSet.java index 61925b6666..49c08353b0 100644 --- a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatFileBasedTileSet.java +++ b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatFileBasedTileSet.java @@ -128,7 +128,7 @@ public class SatFileBasedTileSet extends FileBasedTileSet { int j = (Integer) key.getKey(2); ImageTile tile = this.tileSet.getTile(level, i, j); if (tile != null) { - Rectangle tileRect = tile.rect; + Rectangle tileRect = tile.getRectangle(); ByteBuffer tileData = ByteBuffer.allocate(tileRect.height * tileRect.width); @@ -147,8 +147,7 @@ public class SatFileBasedTileSet extends FileBasedTileSet { try { IImage raster = target.getExtension( IColormappedImageExtension.class).initializeRaster( - new SatDataRetriever(pdo, level, - this.tileSet.getTile(level, i, j).rect, + new SatDataRetriever(pdo, level, tileRect, signed, tileData), cmp); if (raster != null) { addImage(raster, level, i, j); @@ -180,10 +179,11 @@ public class SatFileBasedTileSet extends FileBasedTileSet { if (cmp != null && cmp.getDataUnit() instanceof GenericPixel) { signed = true; } - return target.getExtension(IColormappedImageExtension.class) + return target + .getExtension(IColormappedImageExtension.class) .initializeRaster( new SatDataRetriever(pdo, level, this.tileSet.getTile( - level, i, j).rect, signed, null), cmp); + level, i, j).getRectangle(), signed, null), cmp); } @Override @@ -193,7 +193,7 @@ public class SatFileBasedTileSet extends FileBasedTileSet { // joining adjacent requests. List rectangles = new ArrayList(); for (Point p : tilesToCreate) { - rectangles.add(tileSet.getTile(lvl, p.x, p.y).rect); + rectangles.add(tileSet.getTile(lvl, p.x, p.y).getRectangle()); } // Join together any adjacent rectangles for (int i = 0; i < rectangles.size(); i++) { @@ -228,7 +228,8 @@ public class SatFileBasedTileSet extends FileBasedTileSet { for (Point p : tilesToCreate) { int i = p.x; int j = p.y; - Rectangle tileRectangle = tileSet.getTileSet().get(lvl)[i][j].rect; + Rectangle tileRectangle = tileSet.getTileSet().get(lvl)[i][j] + .getRectangle(); MultiKey key = new MultiKey(lvl, i, j); if (bigRectangle.equals(tileRectangle)) { // This tile is my big rectangle, schedule single tile diff --git a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/VizWorkbenchManager.java b/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/VizWorkbenchManager.java index aa3675d9fa..eeaf803329 100644 --- a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/VizWorkbenchManager.java +++ b/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/VizWorkbenchManager.java @@ -377,6 +377,22 @@ public class VizWorkbenchManager implements IPartListener, IPartListener2, if (parts != null) { parts.add((IEditorPart) part); } + + IEditorPart active = activeEditorMap.get(part.getSite() + .getWorkbenchWindow()); + if (active == null) { + // Active will be null if our active editor became hidden, try + // and get an active editor from the page + active = part.getSite().getPage().getActiveEditor(); + if (active == null) { + // Active will be null here if the page doesn't have an + // active editor so we should use the part that became + // visible + active = (IEditorPart) part; + } + activeEditorMap + .put(part.getSite().getWorkbenchWindow(), active); + } } } diff --git a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/panes/VizDisplayPane.java b/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/panes/VizDisplayPane.java index 7b4d5443f3..a64ec118e1 100644 --- a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/panes/VizDisplayPane.java +++ b/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/panes/VizDisplayPane.java @@ -120,8 +120,11 @@ public class VizDisplayPane implements IDisplayPane { protected static final double ZOOM_ANIMATION_FACTOR = 2.0; + /** The canvas composite */ + private final Composite canvasComp; + /** The canvas */ - protected final Canvas canvas; + private final Canvas canvas; /** The graphics target */ protected IGraphicsTarget target; @@ -196,9 +199,17 @@ public class VizDisplayPane implements IDisplayPane { Composite canvasComp, IRenderableDisplay display, boolean enableContextualMenus) throws VizException { this.container = container; + this.canvasComp = canvasComp; + this.canvasComp.addDisposeListener(new DisposeListener() { + @Override + public void widgetDisposed(DisposeEvent e) { + VizDisplayPane.this.dispose(); + } + }); // create the graphics adapter - graphicsAdapter = getGraphicsAdapter(display); + graphicsAdapter = GraphicsFactory.getGraphicsAdapter(display + .getDisplayType()); // create the canvas this.canvas = graphicsAdapter.constrcutCanvas(canvasComp); // set the renderable display @@ -236,7 +247,7 @@ public class VizDisplayPane implements IDisplayPane { }); Menu menu = menuMgr.createContextMenu(canvas); menu.setVisible(false); - canvas.getParent().setMenu(menu); + canvasComp.setMenu(menu); } // Register ourselves with the DrawCoordinatorJob @@ -263,15 +274,6 @@ public class VizDisplayPane implements IDisplayPane { } }); - canvas.addDisposeListener(new DisposeListener() { - - @Override - public void widgetDisposed(DisposeEvent e) { - VizDisplayPane.this.dispose(); - } - - }); - canvas.addListener(SWT.MouseMove, new Listener() { @Override public void handleEvent(Event event) { @@ -294,9 +296,8 @@ public class VizDisplayPane implements IDisplayPane { * @param display * @return */ - protected AbstractGraphicsFactoryAdapter getGraphicsAdapter( - IRenderableDisplay display) throws VizException { - return GraphicsFactory.getGraphicsAdapter(display.getDisplayType()); + public AbstractGraphicsFactoryAdapter getGraphicsAdapter() { + return graphicsAdapter; } /** @@ -403,7 +404,9 @@ public class VizDisplayPane implements IDisplayPane { renderableDisplay, DisplayChangeType.REMOVE); } - graphicsAdapter.disposeCanvas(canvas); + if (canvas.isDisposed() == false) { + canvasComp.dispose(); + } } } @@ -940,7 +943,7 @@ public class VizDisplayPane implements IDisplayPane { */ @Override public void setVisible(boolean visible) { - canvas.getParent().setVisible(visible); + canvasComp.setVisible(visible); canvas.setVisible(visible); } @@ -963,7 +966,7 @@ public class VizDisplayPane implements IDisplayPane { lastClickX = lastMouseX = e.x; lastClickY = lastMouseY = e.y; if (prefManager.handleLongClick(CONTEXT_MENU_PREF, e.button)) { - canvas.getParent().getMenu().setVisible(false); + canvasComp.getMenu().setVisible(false); synchronized (menuLock) { if (menuJob != null) { menuJob.cancel(); @@ -976,7 +979,7 @@ public class VizDisplayPane implements IDisplayPane { @Override public void run() { if (canvas.isDisposed() == false - && canvas.getParent().getMenu() != null) { + && canvasComp.getMenu() != null) { showMenu(); } } @@ -989,7 +992,7 @@ public class VizDisplayPane implements IDisplayPane { }; menuJob.schedule(275); } else if (prefManager.handleClick(CONTEXT_MENU_PREF, e.button)) { - canvas.getParent().getMenu().setVisible(false); + canvasComp.getMenu().setVisible(false); showMenu(); } } @@ -1000,8 +1003,8 @@ public class VizDisplayPane implements IDisplayPane { protected void showMenu() { Point canvasLoc = canvas.getDisplay().map(canvas, null, lastClickX, lastClickY); - canvas.getParent().getMenu().setLocation(canvasLoc); - canvas.getParent().getMenu().setVisible(true); + canvasComp.getMenu().setLocation(canvasLoc); + canvasComp.getMenu().setVisible(true); } /** diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/AbstractShaderLoader.java b/edexOsgi/com.raytheon.uf.common.dataplugin.grib/src/com/raytheon/uf/common/dataplugin/grib/request/GetCoveragesRequest.java~HEAD similarity index 59% rename from cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/AbstractShaderLoader.java rename to edexOsgi/com.raytheon.uf.common.dataplugin.grib/src/com/raytheon/uf/common/dataplugin/grib/request/GetCoveragesRequest.java~HEAD index 5652c0d8de..5d538a3118 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/glsl/AbstractShaderLoader.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.grib/src/com/raytheon/uf/common/dataplugin/grib/request/GetCoveragesRequest.java~HEAD @@ -17,36 +17,42 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.viz.core.gl.glsl; +package com.raytheon.uf.common.dataplugin.grib.request; + +import java.util.List; + +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +import com.raytheon.uf.common.serialization.comm.IServerRequest; /** + * * TODO Add Description * *
  * 
  * SOFTWARE HISTORY
+ * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
- * May 25, 2010            mschenke     Initial creation
+ * Dec 20, 2011            bsteffen     Initial creation
  * 
  * 
* - * @author mschenke + * @author bsteffen * @version 1.0 */ +@DynamicSerialize +public class GetCoveragesRequest implements IServerRequest { + @DynamicSerializeElement + private List modelNames; -public abstract class AbstractShaderLoader implements IShaderLoader { - - private String programName; - - @Override - public final String getName() { - return programName; + public List getModelNames() { + return modelNames; } - @Override - public final void setName(String name) { - this.programName = name; + public void setModelNames(List modelNames) { + this.modelNames = modelNames; } } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/DefaultPathProvider.java b/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/DefaultPathProvider.java index 6409d0f4b4..1cad2b4fba 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/DefaultPathProvider.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/DefaultPathProvider.java @@ -125,19 +125,23 @@ public class DefaultPathProvider implements IHDFFilePathProvider { // This key is not an embedded object meaning it is a field // in the class passed in. We can get the value directly. else { - property = PropertyUtils.getProperty(persistable, key); + try { + property = PropertyUtils.getProperty(persistable, + key); + } catch (Throwable t) { + // Ignore + property = null; + } } // For times and dates, we must format them correctly - if (property == null) { - pathBuilder.append("null"); - } else if (property instanceof Calendar) { + if (property instanceof Calendar) { pathBuilder.append(TimeUtil .formatCalendar((Calendar) property)); } else if (property instanceof Date) { pathBuilder .append(TimeUtil.formatDate((Date) property)); - } else { + } else if (property != null) { pathBuilder.append(property.toString()); } } catch (Exception e) { @@ -226,11 +230,7 @@ public class DefaultPathProvider implements IHDFFilePathProvider { @Override public String getHDFFileName(String pluginName, IPersistable persistable) { Integer partition = persistable.getHdfFileId(); - if (partition == null) { - throw new IllegalArgumentException( - "Expected argument hdfFileId not set on object " - + persistable.toString()); - } else if (pluginName == null) { + if (pluginName == null) { throw new IllegalArgumentException( "Expected argument pluginName not set on object " + persistable.toString()); @@ -262,12 +262,20 @@ public class DefaultPathProvider implements IHDFFilePathProvider { refTimeString = fileNameFormat.format(refTime); } sb.append(refTimeString); - sb.append("-"); - sb.append(partition); + + if (partition != null) { + sb.append("-"); + sb.append(partition); + } + sb.append(".h5"); return sb.toString(); } + if (partition == null) { + return pluginName + ".h5"; + } + return pluginName + "-" + partition + ".h5"; } diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/WorldWrapChecker.java b/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/util/WorldWrapChecker.java similarity index 68% rename from cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/WorldWrapChecker.java rename to edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/util/WorldWrapChecker.java index 8a8e4d1858..203fe09a48 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/WorldWrapChecker.java +++ b/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/util/WorldWrapChecker.java @@ -17,12 +17,19 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.uf.viz.core.map; +package com.raytheon.uf.common.geospatial.util; +import org.geotools.coverage.grid.GeneralGridGeometry; import org.geotools.referencing.CRS; +import org.geotools.referencing.operation.DefaultMathTransformFactory; import org.geotools.referencing.operation.projection.MapProjection; import org.geotools.referencing.operation.projection.MapProjection.AbstractProvider; import org.opengis.parameter.ParameterValueGroup; +import org.opengis.referencing.operation.MathTransform; + +import com.raytheon.uf.common.geospatial.MapUtil; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; /** * Given a descriptor of a map, this class will check line segments for wrapping @@ -50,9 +57,9 @@ public class WorldWrapChecker { private boolean checkForWrapping = false; - public WorldWrapChecker(IMapDescriptor descriptor) { - MapProjection worldProjection = CRS.getMapProjection(descriptor - .getCRS()); + public WorldWrapChecker(GeneralGridGeometry worldGeometry) { + MapProjection worldProjection = CRS.getMapProjection(worldGeometry + .getCoordinateReferenceSystem()); double centralMeridian = 0.0; if (worldProjection != null) { ParameterValueGroup group = worldProjection.getParameterValues(); @@ -71,12 +78,27 @@ public class WorldWrapChecker { double r1 = inverseCentralMeridian - 359.9; double r2 = inverseCentralMeridian - 359.8; - double xl1 = descriptor.worldToPixel(new double[] { l1, 0.0 })[0]; - double xl2 = descriptor.worldToPixel(new double[] { l2, 0.0 })[0]; - double xr1 = descriptor.worldToPixel(new double[] { r1, 0.0 })[0]; - double xr2 = descriptor.worldToPixel(new double[] { r2, 0.0 })[0]; + try { + MathTransform latLonToGrid = new DefaultMathTransformFactory() + .createConcatenatedTransform(MapUtil + .getTransformFromLatLon(worldGeometry + .getCoordinateReferenceSystem()), + worldGeometry.getGridToCRS().inverse()); - checkForWrapping = Math.abs(xl1 - xr1) > Math.abs(xl2 - xr2); + double[] in = new double[] { l1, 0.0, l2, 0.0, r1, 0.0, r2, 0.0 }; + double[] out = new double[in.length]; + latLonToGrid.transform(in, 0, out, 0, 4); + + double xl1 = out[0]; + double xl2 = out[2]; + double xr1 = out[4]; + double xr2 = out[6]; + + checkForWrapping = Math.abs(xl1 - xr1) > Math.abs(xl2 - xr2); + } catch (Throwable t) { + UFStatus.getHandler().handle(Priority.PROBLEM, + "Error determing world wrap checking", t); + } } /** diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/WorldWrapCorrector.java b/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/util/WorldWrapCorrector.java similarity index 96% rename from cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/WorldWrapCorrector.java rename to edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/util/WorldWrapCorrector.java index 7c65300d75..dcc8f3e2a3 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/map/WorldWrapCorrector.java +++ b/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/util/WorldWrapCorrector.java @@ -17,12 +17,14 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.uf.viz.core.map; +package com.raytheon.uf.common.geospatial.util; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.geotools.coverage.grid.GeneralGridGeometry; + import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; @@ -53,12 +55,12 @@ public class WorldWrapCorrector { private WorldWrapChecker checker; /** - * Constructs of world wrap corrector for the specified descriptor + * Constructs of world wrap corrector for the specified world * * @param descriptor */ - public WorldWrapCorrector(IMapDescriptor descriptor) { - checker = new WorldWrapChecker(descriptor); + public WorldWrapCorrector(GeneralGridGeometry worldGeometry) { + checker = new WorldWrapChecker(worldGeometry); } /** diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarImageResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarImageResource.java index 635fac81c8..40e0f428f4 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarImageResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarImageResource.java @@ -73,7 +73,6 @@ import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; import com.raytheon.uf.viz.core.rsc.capabilities.OutlineCapability; import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; -import com.raytheon.uf.viz.core.rsc.hdf5.MeshCalculatorJob; import com.raytheon.uf.viz.core.style.DataMappingPreferences; import com.raytheon.uf.viz.core.style.DataMappingPreferences.DataMappingEntry; import com.raytheon.viz.awipstools.capabilities.RangeRingsOverlayCapability; @@ -322,71 +321,21 @@ public abstract class RadarImageResource extends tiltRecord.tile = new ImageTile(); } - if (tiltRecord.tile.coverage == null) { - tiltRecord.tile.coverage = buildCoverage(target, tiltRecord); - } - - try { - RadarRecord record = populatedRecord; - - // Attempt to create envelope, adapted from AbstractTileSet - double maxExtent = RadarUtil.calculateExtent(record); - GridGeometry2D geom = RadarUtil.constructGridGeometry( - record.getCRS(), maxExtent, - Math.max(record.getNumBins(), record.getNumRadials())); - - MathTransform mt = geom.getGridToCRS(PixelInCell.CELL_CORNER); - - double[] ul = new double[3]; - double[] lr = new double[3]; - double[] in = new double[2]; - in[0] = 0; - in[1] = 0; - mt.transform(in, 0, ul, 0, 1); - in[0] = record.getNumRadials(); - in[1] = record.getNumBins(); - mt.transform(in, 0, lr, 0, 1); - - tiltRecord.tile.envelope = new ReferencedEnvelope(ul[0], lr[0], ul[1], lr[1], - record.getCRS()); - } catch (Exception e) { - statusHandler.handle(Priority.PROBLEM, - "Error constructing extent", e); - } - - tiltRecord.tile.rect = new Rectangle(0, 0, - populatedRecord.getNumBins(), populatedRecord.getNumRadials()); - - + tiltRecord.tile.coverage = buildCoverage(target, tiltRecord); if (tiltRecord.tile.coverage.getMesh() == null) { - IMesh mesh = buildMesh(target, tiltRecord); - - if (mesh != null) { - try { - MeshCalculatorJob.getInstance().requestLoad( - this, - mesh, - tiltRecord.tile, - CRS.findMathTransform(populatedRecord.getCRS(), - DefaultGeographicCRS.WGS84)); - } catch (FactoryException e) { - statusHandler.handle( - Priority.PROBLEM, - "Error finding math transform to lat/lon for radar record", - e); - } - } + tiltRecord.tile.coverage.setMesh(buildMesh(target, tiltRecord)); } + + Rectangle rect = new Rectangle(0, 0, populatedRecord.getNumBins(), + populatedRecord.getNumRadials()); tiltRecord.image = target.initializeRaster(CMDataPreparerManager - .getDataPreparer(BufferUtil.wrapDirect( - toImageData(tiltRecord.params, populatedRecord), - new Rectangle(0, 0, populatedRecord.getNumBins(), - populatedRecord.getNumRadials())), - tiltRecord.tile.rect, new int[] { - tiltRecord.tile.rect.width, - tiltRecord.tile.rect.height }), - tiltRecord.params); + .getDataPreparer(BufferUtil.wrapDirect( + toImageData(tiltRecord.params, populatedRecord), + new Rectangle(0, 0, populatedRecord.getNumBins(), + populatedRecord.getNumRadials())), rect, + new int[] { rect.width, rect.height }), + tiltRecord.params); } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarRadialResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarRadialResource.java index 613b61cd9f..73b137bad8 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarRadialResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.mosaic/src/gov/noaa/nws/ncep/viz/rsc/mosaic/rsc/RadarRadialResource.java @@ -39,7 +39,6 @@ import com.raytheon.uf.viz.core.rsc.ResourceType; import com.raytheon.uf.viz.core.rsc.IResourceDataChanged.ChangeType; import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; -import com.raytheon.uf.viz.core.rsc.hdf5.MeshCalculatorJob; import com.raytheon.viz.awipstools.capabilities.EAVCapability; import com.raytheon.viz.awipstools.common.EstimatedActualVelocity; import com.raytheon.viz.radar.IRadarRecordMetadata; @@ -153,17 +152,8 @@ public class RadarRadialResource extends RadarImageResource { super.project(crs); for (RadarTimeRecord rtr : radarRecords.values()) { if (rtr.tile != null && rtr.tile.coverage.getMesh() != null) { - try { - MeshCalculatorJob.getInstance().requestLoad( - this, - rtr.tile.coverage.getMesh(), - rtr.tile, - CRS.findMathTransform(rtr.radarCacheObject.getMetadata().getCRS(), - DefaultGeographicCRS.WGS84)); - } catch (FactoryException e) { - statusHandler.handle(Priority.PROBLEM, - "Error constructing transform for mesh", e); - } + rtr.tile.coverage.getMesh().reproject( + descriptor.getGridGeometry()); } else { refreshDisplay = true; } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/RadarImageResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/RadarImageResource.java index 806b9fcd18..2137e86b4e 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/RadarImageResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/RadarImageResource.java @@ -77,7 +77,6 @@ import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; import com.raytheon.uf.viz.core.rsc.capabilities.OutlineCapability; import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; -import com.raytheon.uf.viz.core.rsc.hdf5.MeshCalculatorJob; import com.raytheon.uf.viz.core.style.DataMappingPreferences; import com.raytheon.uf.viz.core.style.DataMappingPreferences.DataMappingEntry; import com.raytheon.viz.awipstools.capabilities.RangeRingsOverlayCapability; @@ -338,64 +337,16 @@ public abstract class RadarImageResource extends ColorMapParameters params = getColorMapParameters(target, populatedRecord); - ImageTile tile = new ImageTile(); - RadarRecord record = populatedRecord; - try { - // Attempt to create envelope, adapted from AbstractTileSet - double maxExtent = RadarUtil.calculateExtent(record); - GridGeometry2D geom = RadarUtil.constructGridGeometry( - record.getCRS(), maxExtent, - Math.max(record.getNumBins(), record.getNumRadials())); - - MathTransform mt = geom.getGridToCRS(PixelInCell.CELL_CORNER); - - double[] ul = new double[3]; - double[] lr = new double[3]; - double[] in = new double[2]; - in[0] = 0; - in[1] = 0; - mt.transform(in, 0, ul, 0, 1); - in[0] = record.getNumRadials(); - in[1] = record.getNumBins(); - mt.transform(in, 0, lr, 0, 1); - - tile.envelope = new ReferencedEnvelope(ul[0], lr[0], ul[1], lr[1], - record.getCRS()); - } catch (Exception e) { - statusHandler.handle(Priority.PROBLEM, "Error constructing extent", - e); - } - - tile.rect = new Rectangle(0, 0, populatedRecord.getNumBins(), - populatedRecord.getNumRadials()); - - if (tile.coverage == null) { - tile.coverage = buildCoverage(target, tile, populatedRecord); - } - - if (tile.coverage.getMesh() == null) { - IMesh mesh = buildMesh(target, populatedRecord); - - if (mesh != null) { - try { - MeshCalculatorJob.getInstance().requestLoad( - this, - mesh, - tile, - CRS.findMathTransform(populatedRecord.getCRS(), - DefaultGeographicCRS.WGS84)); - } catch (FactoryException e) { - statusHandler - .handle(Priority.PROBLEM, - "Error finding math transform to lat/lon for radar record", - e); - } - } + PixelCoverage coverage = buildCoverage(target, populatedRecord); + if (coverage.getMesh() == null) { + coverage.setMesh(buildMesh(target, populatedRecord)); } - IImage image = createImage(target, params, record, tile.rect); + IImage image = createImage(target, params, populatedRecord, + new Rectangle(0, 0, populatedRecord.getNumBins(), + populatedRecord.getNumRadials())); DrawableImage dImage = images.put(populatedRecord.getDataTime(), - new DrawableImage(image, tile.coverage)); + new DrawableImage(image, coverage)); if (dImage != null) { disposeImage(dImage); } @@ -773,7 +724,7 @@ public abstract class RadarImageResource extends return null; } - public PixelCoverage buildCoverage(IGraphicsTarget target, ImageTile tile, + public PixelCoverage buildCoverage(IGraphicsTarget target, VizRadarRecord timeRecord) throws VizException { return new PixelCoverage(new Coordinate(0, 0), 0, 0); } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/image/RadarRasterResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/image/RadarRasterResource.java index 2845ea3691..e7e9ec69fd 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/image/RadarRasterResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.ncradar/src/gov/noaa/nws/ncep/viz/rsc/ncradar/rsc/image/RadarRasterResource.java @@ -10,12 +10,14 @@ package gov.noaa.nws.ncep.viz.rsc.ncradar.rsc.image; import java.awt.Rectangle; import java.util.HashMap; +import org.geotools.coverage.grid.GridGeometry2D; import org.geotools.referencing.CRS; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.raytheon.uf.common.dataplugin.radar.RadarRecord; +import com.raytheon.uf.common.dataplugin.radar.util.RadarUtil; import com.raytheon.uf.common.dataquery.requests.RequestConstraint; import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.time.DataTime; @@ -128,22 +130,19 @@ public class RadarRasterResource extends RadarImageResource { } @Override - public PixelCoverage buildCoverage(IGraphicsTarget target, ImageTile tile, + public PixelCoverage buildCoverage(IGraphicsTarget target, VizRadarRecord timeRecord) throws VizException { if (sharedCoverage == null) { - sharedCoverage = super.buildCoverage(target, tile, timeRecord); + double maxExtent = RadarUtil.calculateExtent(timeRecord); + GridGeometry2D geom = RadarUtil.constructGridGeometry( + timeRecord.getCRS(), + maxExtent, + Math.max(timeRecord.getNumBins(), + timeRecord.getNumRadials())); - IMesh mesh = target.getExtension(IMapMeshExtension.class) - .constructMesh(descriptor); - try { - mesh.calculateMesh(sharedCoverage, tile, CRS.findMathTransform( - timeRecord.getCRS(), DefaultGeographicCRS.WGS84)); - } catch (FactoryException e) { - statusHandler - .handle(Priority.PROBLEM, - "Error finding math transform to lat/lon for radar record", - e); - } + sharedCoverage = super.buildCoverage(target, timeRecord); + sharedCoverage.setMesh(target.getExtension(IMapMeshExtension.class) + .constructMesh(geom, descriptor.getGridGeometry())); } return sharedCoverage; } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/src/gov/noaa/nws/ncep/viz/rsc/satellite/rsc/McidasFileBasedTileSet.java b/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/src/gov/noaa/nws/ncep/viz/rsc/satellite/rsc/McidasFileBasedTileSet.java index b95f501aae..21e4710597 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/src/gov/noaa/nws/ncep/viz/rsc/satellite/rsc/McidasFileBasedTileSet.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.satellite/src/gov/noaa/nws/ncep/viz/rsc/satellite/rsc/McidasFileBasedTileSet.java @@ -6,6 +6,7 @@ package gov.noaa.nws.ncep.viz.rsc.satellite.rsc; import java.awt.Rectangle; import java.util.Map; import org.geotools.coverage.grid.GridGeometry2D; +import org.geotools.geometry.GeneralEnvelope; import org.geotools.geometry.jts.ReferencedEnvelope; import org.opengis.referencing.datum.PixelInCell; @@ -15,6 +16,7 @@ import org.opengis.referencing.operation.MathTransform; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.datastorage.StorageException; +import com.raytheon.uf.common.geospatial.MapUtil; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; @@ -96,7 +98,11 @@ public class McidasFileBasedTileSet extends SatFileBasedTileSet { } try { - + ReferencedEnvelope mapEnv = new ReferencedEnvelope( + this.mapDescriptor.getGridGeometry().getEnvelope()); + mapEnv = mapEnv.transform(MapUtil.LATLON_PROJECTION, false); + GeneralEnvelope generalMapEnv = new GeneralEnvelope(mapEnv); + generalMapEnv.normalize(false); startY = 0; for (int j = 0; j < totalTilesY; j++) { startY = j * (inTileSize); @@ -127,18 +133,23 @@ public class McidasFileBasedTileSet extends SatFileBasedTileSet { mathTransform[level].transform(in, 0, lr, 0, 1); ReferencedEnvelope env = new ReferencedEnvelope(ul[0], - lr[0], ul[1], lr[1], gridGeometry[0] - .getCoordinateReferenceSystem()); + lr[0], ul[1], lr[1], + gridGeometry[0].getCoordinateReferenceSystem()); + GeneralEnvelope generalEnv = new GeneralEnvelope( + env.transform(MapUtil.LATLON_PROJECTION, false)); + // tiles which cross the dateline will almost always be + // created since normalizing changes their range to + // -180,180. If this is causing problems then instead of + // normalizing we should split envelopes that cross the + // dateline. + generalEnv.normalize(false); + // only create the tile if env overlaps the map + if (generalEnv.intersects(generalMapEnv, true)) { tiles[i][j] = new ImageTile(); - - tiles[i][j].rect = new Rectangle(startX, startY, - effectiveWidth, effectiveHeight); - - tiles[i][j].envelope = env; - tiles[i][j].elevation = this.elevation; - tiles[i][j].rect.width = effectiveWidth; - tiles[i][j].rect.height = effectiveHeight; + tiles[i][j].setGridGeometry(new Rectangle(startX, + startY, effectiveWidth, effectiveHeight), env); + } } } @@ -224,6 +235,7 @@ public class McidasFileBasedTileSet extends SatFileBasedTileSet { continue; } + ReferencedEnvelope envelope = tile.getEnvelope(); //if (this.sharedGeometryTileSet != null) { // ImageTile baseTile = sharedGeometryTileSet.tileSet // .getTileSet().get(level)[i][j]; @@ -236,9 +248,8 @@ public class McidasFileBasedTileSet extends SatFileBasedTileSet { double[] ur = new double[2]; try { - ReferencedEnvelope envelope = ((ReferencedEnvelope) tile.envelope) - .transform(mapDescriptor.getCRS(), - false); + envelope = tile.getEnvelope().transform( + mapDescriptor.getCRS(), false); ll[0] = envelope.getMinX(); ll[1] = envelope.getMinY(); @@ -251,20 +262,25 @@ public class McidasFileBasedTileSet extends SatFileBasedTileSet { lr[0] = envelope.getMaxX(); lr[1] = envelope.getMinY(); - mapDescriptor.getGridGeometry().getGridToCRS() - .inverse().transform(ul, 0, ul, 0, 1); - mapDescriptor.getGridGeometry().getGridToCRS() - .inverse().transform(ll, 0, ll, 0, 1); - mapDescriptor.getGridGeometry().getGridToCRS() - .inverse().transform(lr, 0, lr, 0, 1); - mapDescriptor.getGridGeometry().getGridToCRS() - .inverse().transform(ur, 0, ur, 0, 1); + mapDescriptor.getGridGeometry() + .getGridToCRS().inverse() + .transform(ul, 0, ul, 0, 1); + mapDescriptor.getGridGeometry() + .getGridToCRS().inverse() + .transform(ll, 0, ll, 0, 1); + mapDescriptor.getGridGeometry() + .getGridToCRS().inverse() + .transform(lr, 0, lr, 0, 1); + mapDescriptor.getGridGeometry() + .getGridToCRS().inverse() + .transform(ur, 0, ur, 0, 1); } catch (Throwable t) { // Skip tile on error statusHandler.handle(Priority.VERBOSE, - "Error reprojecting tile " + i + ":" - + j + " at level " + level, t); + "Error reprojecting tile " + i + + ":" + j + " at level " + + level, t); ul = ll = lr = ur = null; tileLevel[i][j] = null; } @@ -274,19 +290,21 @@ public class McidasFileBasedTileSet extends SatFileBasedTileSet { tile.coverage = null; } else { - Coordinate ulc = new Coordinate(ul[0], ul[1], 0); - Coordinate llc = new Coordinate(ll[0], ll[1], 0); - Coordinate lrc = new Coordinate(lr[0], lr[1], 0); - Coordinate urc = new Coordinate(ur[0], ur[1], 0); + Coordinate ulc = new Coordinate(ul[0], + ul[1], 0); + Coordinate llc = new Coordinate(ll[0], + ll[1], 0); + Coordinate lrc = new Coordinate(lr[0], + lr[1], 0); + Coordinate urc = new Coordinate(ur[0], + ur[1], 0); tile.coverage = new PixelCoverage(ulc, urc, lrc, llc); } - } else { - if (tile.envelope != null) { - tile.coverage = mapDescriptor - .worldToPixel(tile.envelope); - } + } else if (envelope != null) { + tile.coverage = mapDescriptor + .worldToPixel(envelope); } }