From dcbab7d58f96e96c098bf646dab647005c49113f Mon Sep 17 00:00:00 2001 From: Max Schenkelberg Date: Mon, 20 Aug 2012 14:47:14 -0500 Subject: [PATCH] Issue #28 Cleaned up True Color code and removed old MultiChannel code. Adding capping index back to indexing.glsl and added no data value to ColorMapParameters that should be used for finding no data values in shader and in java. True color dialog was written but not hooked in yet as need to still think about single resource tied to multiple channels and serializing changes. Change-Id: I20bff443fe4c9b9330c0a66779218227c48df014 Former-commit-id: fc06265360c697fdaa4751753f671f1e76d4c10a [formerly b69d2cad1cd5b98a6c416ab3b8a8a43c7c82ad81] [formerly fc06265360c697fdaa4751753f671f1e76d4c10a [formerly b69d2cad1cd5b98a6c416ab3b8a8a43c7c82ad81] [formerly 1b406ecfcabdca2a9d4cd3d9f31ab004f65c5206 [formerly 564b38b30562a371cf0345de572b32ea8f53e82e]]] Former-commit-id: 1b406ecfcabdca2a9d4cd3d9f31ab004f65c5206 Former-commit-id: 47cefd15133d965b6d50c24dc76639c6c24af8f6 [formerly aa9df46a1db83e1878e0b6f01e0d8e9d21f60e36] Former-commit-id: 362d34bee0bad9607433fd405da90b0f2af7612b --- .../core/drawables/ColorMapParameters.java | 18 + .../uf/viz/core/drawables/ImagingSupport.java | 2 +- .../colormap/IMultiChannelImageExtension.java | 104 ---- .../capabilities/MultiChannelCapability.java | 313 ----------- .../com/raytheon/uf/viz/core/tile/Tile.java | 20 +- .../raytheon/uf/viz/core/tile/TileLevel.java | 9 +- .../localization/glsl/truecolor.glsl | 21 +- .../GLTrueColorImagingExtension.java | 55 +- .../truecolor/gl/image/GLTrueColorImage.java | 78 ++- .../META-INF/MANIFEST.MF | 2 +- ...f.common.serialization.ISerializableObject | 1 + cave/com.raytheon.uf.viz.truecolor/plugin.xml | 10 + .../extension/ITrueColorImagingExtension.java | 2 + .../uf/viz/truecolor/rsc/ChannelResource.java | 153 ++++++ .../truecolor/rsc/TrueColorResourceGroup.java | 222 ++++++-- .../rsc/TrueColorResourceGroupData.java | 190 +------ .../uf/viz/truecolor/ui/TrueColorDialog.java} | 176 ++++--- .../truecolor/ui/TrueColorDialogAction.java} | 58 +-- .../localization/glsl/colormapRaster.glsl | 2 +- .../localization/glsl/include/indexing.glsl | 6 +- .../localization/glsl/multichannel.glsl | 70 --- cave/com.raytheon.viz.core.gl/plugin.xml | 3 - .../gl/ext/AbstractGLImagingExtension.java | 32 +- .../viz/core/gl/glsl/GLShaderProgram.java | 5 +- .../viz/core/gl/images/GLImageChannel.java | 113 ---- .../core/gl/images/GLMultiChannelImage.java | 262 ---------- .../ext/GLMultiChannelImageExtension.java | 184 ------- cave/com.raytheon.viz.satellite/plugin.xml | 5 - .../satellite/rsc/SatTrueColorResource.java | 489 ------------------ .../rsc/SatTrueColorResourceData.java | 134 ----- cave/com.raytheon.viz.ui/plugin.xml | 5 - 31 files changed, 721 insertions(+), 2023 deletions(-) delete mode 100644 cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/IMultiChannelImageExtension.java delete mode 100644 cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/capabilities/MultiChannelCapability.java create mode 100644 cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/rsc/ChannelResource.java rename cave/{com.raytheon.viz.ui/src/com/raytheon/viz/ui/dialogs/MultiChannelDialog.java => com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/ui/TrueColorDialog.java} (51%) rename cave/{com.raytheon.viz.ui/src/com/raytheon/viz/ui/cmenu/MultiChannelImagingAction.java => com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/ui/TrueColorDialogAction.java} (52%) delete mode 100644 cave/com.raytheon.viz.core.gl/localization/glsl/multichannel.glsl delete mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImageChannel.java delete mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLMultiChannelImage.java delete mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLMultiChannelImageExtension.java delete mode 100644 cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatTrueColorResource.java delete mode 100644 cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatTrueColorResourceData.java 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 3be9fb188e..1cd8a2f8d5 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 @@ -187,6 +187,8 @@ public class ColorMapParameters implements Cloneable, ISerializableObject { private boolean mirror; + private double noDataValue = Double.NaN; + @XmlElement private PersistedParameters persisted = new PersistedParameters(); @@ -1009,4 +1011,20 @@ public class ColorMapParameters implements Cloneable, ISerializableObject { this.colorMapMax = params.colorMapMax; } } + + /** + * @return the noDataValue + */ + public double getNoDataValue() { + return noDataValue; + } + + /** + * @param noDataValue + * the noDataValue to set + */ + public void setNoDataValue(double noDataValue) { + this.noDataValue = noDataValue; + } + } 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 index 764209e217..40d2baa3f3 100644 --- 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 @@ -124,7 +124,7 @@ public class ImagingSupport { bulk.toArray(new DrawableImage[bulk.size()])); } - return rval & skipped; + return rval & !skipped; } /** diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/IMultiChannelImageExtension.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/IMultiChannelImageExtension.java deleted file mode 100644 index 92f6eeef2b..0000000000 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/IMultiChannelImageExtension.java +++ /dev/null @@ -1,104 +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.util.Map; - -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; -import com.raytheon.uf.viz.core.exception.VizException; - -/** - * {@link IImagingExtension} used to create and draw multi-channel R,G,B images - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Jul 5, 2012            mschenke     Initial creation
- * 
- * 
- * - * @author mschenke - * @version 1.0 - */ - -public interface IMultiChannelImageExtension extends IImagingExtension { - - public static enum Channel { - RED, GREEN, BLUE; - } - - public static class ChannelData { - public String name; - - public ColorMapParameters parameters; - - public boolean invert; - - public ChannelData(String name, ColorMapParameters params, - boolean invert) { - this.name = name; - this.parameters = params; - } - } - - public static interface IMultiChannelImage extends IImage { - - public Map getImageMapping(); - - public void setImageMapping(Map mapping); - - } - - public static interface IImageChannel extends IColormappedImage { - - public void setInverted(boolean inverted); - - } - - /** - * Construct a true color image, this - * - * @param channelMap - * @return - * @throws VizException - */ - public IMultiChannelImage constructImage( - Map imageMapping) throws VizException; - - /** - * Construct a IImageChannel for a IMultiChannelImage - * - * @param callback - * @param inverted - * @return - * @throws VizException - */ - public IImageChannel constructImage( - IColorMapDataRetrievalCallback callback, ChannelData channelData) - throws VizException; - -} diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/capabilities/MultiChannelCapability.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/capabilities/MultiChannelCapability.java deleted file mode 100644 index 259b6d6799..0000000000 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/capabilities/MultiChannelCapability.java +++ /dev/null @@ -1,313 +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.capabilities; - -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.adapters.XmlAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; - -import com.raytheon.uf.viz.core.drawables.ColorMapParameters; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.Channel; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.ChannelData; - -/** - * Capability for multi channel imagery - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Dec 20, 2011            mschenke     Initial creation
- * 
- * 
- * - * @author mschenke - * @version 1.0 - */ -@XmlAccessorType(XmlAccessType.NONE) -public class MultiChannelCapability extends AbstractCapability { - - @XmlAccessorType(XmlAccessType.NONE) - public static class ChannelSerializable { - - @XmlAttribute - private String name; - - @XmlAttribute - private Channel channel; - - @XmlAttribute - private boolean invert; - - @XmlElement - private float dataMin; - - @XmlElement - private float dataMax; - - @XmlElement - private float cmapMin; - - @XmlElement - private float cmapMax; - - public ChannelSerializable() { - - } - - public ChannelSerializable(Channel channel, ChannelData channelData) { - this.channel = channel; - this.name = channelData.name; - this.invert = channelData.invert; - ColorMapParameters params = channelData.parameters; - this.dataMin = params.getDataMin(); - this.dataMax = params.getDataMax(); - this.cmapMin = params.getColorMapMin(); - this.cmapMax = params.getColorMapMax(); - } - - /** - * @return the name - */ - public String getName() { - return name; - } - - /** - * @param name - * the name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * @return the channel - */ - public Channel getChannel() { - return channel; - } - - /** - * @param channel - * the channel to set - */ - public void setChannel(Channel channel) { - this.channel = channel; - } - - /** - * @return the dataMin - */ - public float getDataMin() { - return dataMin; - } - - /** - * @param dataMin - * the dataMin to set - */ - public void setDataMin(float dataMin) { - this.dataMin = dataMin; - } - - /** - * @return the dataMax - */ - public float getDataMax() { - return dataMax; - } - - /** - * @param dataMax - * the dataMax to set - */ - public void setDataMax(float dataMax) { - this.dataMax = dataMax; - } - - /** - * @return the cmapMin - */ - public float getCmapMin() { - return cmapMin; - } - - /** - * @param cmapMin - * the cmapMin to set - */ - public void setCmapMin(float cmapMin) { - this.cmapMin = cmapMin; - } - - /** - * @return the cmapMax - */ - public float getCmapMax() { - return cmapMax; - } - - /** - * @param cmapMax - * the cmapMax to set - */ - public void setCmapMax(float cmapMax) { - this.cmapMax = cmapMax; - } - - /** - * @return the invert - */ - public boolean isInvert() { - return invert; - } - - /** - * @param invert - * the invert to set - */ - public void setInvert(boolean invert) { - this.invert = invert; - } - - } - - public static class Marshaller extends - XmlAdapter> { - - /* - * (non-Javadoc) - * - * @see - * javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal(java.lang - * .Object) - */ - @Override - public HashMap unmarshal(ChannelSerializable[] v) - throws Exception { - HashMap channelMap = new HashMap(); - for (ChannelSerializable cs : v) { - ColorMapParameters params = new ColorMapParameters(); - params.setDataMin(cs.dataMin); - params.setDataMax(cs.dataMax); - params.setColorMapMin(cs.cmapMin); - params.setColorMapMax(cs.cmapMax); - channelMap.put(cs.channel, new ChannelData(cs.name, params, - cs.invert)); - } - return channelMap; - } - - /* - * (non-Javadoc) - * - * @see - * javax.xml.bind.annotation.adapters.XmlAdapter#marshal(java.lang.Object - * ) - */ - @Override - public ChannelSerializable[] marshal(HashMap v) - throws Exception { - ChannelSerializable[] serializable = new ChannelSerializable[v - .size()]; - int i = 0; - for (Entry entry : v.entrySet()) { - ChannelSerializable cs = new ChannelSerializable( - entry.getKey(), entry.getValue()); - serializable[i++] = cs; - } - return serializable; - } - - } - - @XmlJavaTypeAdapter(value = Marshaller.class) - private HashMap channelMap = new HashMap(); - - private String[] names; - - /** - * @return the names - */ - public String[] getNames() { - return names; - } - - /** - * @param names - * the names to set - */ - public void setNames(String[] names) { - this.names = names; - } - - /** - * @return the channelMap - */ - public Map getChannelMap() { - return channelMap; - } - - /** - * @param channelMap - * the channelMap to set - */ - public void setChannelMap(HashMap channelMap) { - if (channelMap == null) { - channelMap = new HashMap(); - } - this.channelMap = channelMap; - capabilityChanged(); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability# - * capabilityChanged() - */ - @Override - public void capabilityChanged() { - super.capabilityChanged(); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability#clone() - */ - @Override - public AbstractCapability clone() { - MultiChannelCapability cap = new MultiChannelCapability(); - cap.channelMap = new HashMap(channelMap); - return cap; - } - -} diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/Tile.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/Tile.java index 1c338e52e4..bdf90b372f 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/Tile.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/Tile.java @@ -123,7 +123,7 @@ public class Tile { * @param y * @return */ - public boolean contains(double x, double y) { + public boolean crsContains(double x, double y) { Envelope env = tileGeometry.getEnvelope(); return env.getMinimum(0) <= x && env.getMaximum(0) >= x && env.getMinimum(1) <= y && env.getMaximum(1) >= y; @@ -135,8 +135,22 @@ public class Tile { * @param c * @return */ - public boolean contains(Coordinate c) { - return contains(c.x, c.y); + public boolean crsContains(Coordinate c) { + return crsContains(c.x, c.y); + } + + /** + * Checks to see if the x/y coordinate is contained by the Tile's grid + * envelope + * + * @param gridX + * @param gridY + * @return + */ + public boolean gridContains(int gridX, int gridY) { + GridEnvelope ge = tileGeometry.getGridRange(); + return ge.getLow(0) <= gridX && ge.getHigh(0) >= gridX + && ge.getLow(1) <= gridY && ge.getHigh(1) >= gridY; } /* diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/TileLevel.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/TileLevel.java index 06c0c30a02..a6cf76a71c 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/TileLevel.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/TileLevel.java @@ -225,11 +225,14 @@ public class TileLevel { * @return */ public Tile getTile(double x, double y) { - int xIdx = (int) x / tileSize; - int yIdx = (int) y / tileSize; + double xIdx = x / tileSize; + double yIdx = y / tileSize; if (xIdx >= 0 && yIdx >= 0 && xIdx < getNumXTiles() && yIdx < getNumYTiles()) { - return tiles[yIdx][xIdx]; + Tile tile = getTile((int) xIdx, (int) yIdx); + if (tile.gridContains((int) x, (int) y)) { + return tile; + } } return null; } diff --git a/cave/com.raytheon.uf.viz.truecolor.gl/localization/glsl/truecolor.glsl b/cave/com.raytheon.uf.viz.truecolor.gl/localization/glsl/truecolor.glsl index 9efa34dbbc..55a5f91181 100644 --- a/cave/com.raytheon.uf.viz.truecolor.gl/localization/glsl/truecolor.glsl +++ b/cave/com.raytheon.uf.viz.truecolor.gl/localization/glsl/truecolor.glsl @@ -14,15 +14,20 @@ uniform sampler2D trueColorTexture; uniform int height; uniform int width; +uniform float noDataValue; +uniform float alphaStep; +uniform int checkAlpha; + float getIndex(sampler2D rawTex, float cmapMin, float cmapMax, float naturalMin, float naturalMax, int isFloat) { vec4 textureValue = texture2D(rawTex, gl_TexCoord[0].st); float naturalVal = textureValue.r; if ( isFloat == 0 ) { naturalVal = ((naturalVal * (naturalMax - naturalMin)) + naturalMin); } - float index = findIndex(naturalVal, cmapMin, cmapMax); - if (index < 0.0 || index > 1.0) { - index = -1.0; + + float index = 0.0; + if (naturalVal != noDataValue && naturalVal == naturalVal) { + index = findIndex(naturalVal, cmapMin, cmapMax); } return index; } @@ -39,11 +44,6 @@ void main(void) float a = curVal.a; float index = getIndex(rawTex, cmapMin, cmapMax, naturalMin, naturalMax, isFloat); - if ( index < 0.0 ) { - index = a = 0.0; - } else { - a = 1.0; - } if ( band == 0 && index > r ) { r = index; } else if ( band == 1 && index > g ) { @@ -51,6 +51,11 @@ void main(void) } else if ( band == 2 && index > b ) { b = index; } + a = a + alphaStep; + + if (checkAlpha == 1 && a < 1.0) { + a = 0.0; + } gl_FragColor = vec4(r,g,b,a); } \ No newline at end of file diff --git a/cave/com.raytheon.uf.viz.truecolor.gl/src/com/raytheon/uf/viz/truecolor/gl/extension/GLTrueColorImagingExtension.java b/cave/com.raytheon.uf.viz.truecolor.gl/src/com/raytheon/uf/viz/truecolor/gl/extension/GLTrueColorImagingExtension.java index 3d0ef34d3c..d4bddac86e 100644 --- a/cave/com.raytheon.uf.viz.truecolor.gl/src/com/raytheon/uf/viz/truecolor/gl/extension/GLTrueColorImagingExtension.java +++ b/cave/com.raytheon.uf.viz.truecolor.gl/src/com/raytheon/uf/viz/truecolor/gl/extension/GLTrueColorImagingExtension.java @@ -19,6 +19,9 @@ **/ package com.raytheon.uf.viz.truecolor.gl.extension; +import java.util.IdentityHashMap; +import java.util.Map; + import javax.media.opengl.GL; import com.raytheon.uf.viz.core.DrawableImage; @@ -61,6 +64,20 @@ public class GLTrueColorImagingExtension extends AbstractGLSLImagingExtension private Channel renderingChannel; + private Map parameters = new IdentityHashMap(); + + /** + * Alpha value to add to current alpha. When all 3 passes occur, alpha + * should be >= 1.0 + */ + private float alphaStep; + + /** + * Flag if alpha check should be performed in shader. Alpha vals less than + * one will be set to 0 + */ + private boolean checkAlpha; + /* * (non-Javadoc) * @@ -102,6 +119,7 @@ public class GLTrueColorImagingExtension extends AbstractGLSLImagingExtension if (image instanceof GLTrueColorImage) { GLTrueColorImage trueColorImage = (GLTrueColorImage) image; if (trueColorImage.isRepaint()) { + parameters.clear(); writeToImage = trueColorImage; GLOffscreenRenderingExtension extension = target .getExtension(GLOffscreenRenderingExtension.class); @@ -109,28 +127,33 @@ public class GLTrueColorImagingExtension extends AbstractGLSLImagingExtension extension.renderOffscreen(trueColorImage, trueColorImage.getImageExtent()); boolean allPainted = true; + int channels = trueColorImage.getNumberOfChannels(); + // Calculate our alpha step, ensure channels * alphaStep >= + // 1.0 + alphaStep = 1.0f / (channels - 0.1f); + int i = 1; for (Channel channel : Channel.values()) { renderingChannel = channel; DrawableImage[] imagesToDraw = trueColorImage .getImages(channel); if (imagesToDraw != null && imagesToDraw.length > 0) { + // Perform alpha check on last pass + checkAlpha = i == channels; // Make sure images are staged before we mosaic them ImagingSupport.prepareImages(target, imagesToDraw); // Each image needs to draw separately due to gl - // issues when - // zoomed in very far, rendered parts near the - // corners don't - // show all the pixels for each image. Pushing and - // popping - // GL_TEXTURE_BIT before/after each render fixes - // this issue + // issues when zoomed in very far, rendered parts + // near the corners don't show all the pixels for + // each image. Pushing and popping GL_TEXTURE_BIT + // before/after each render fixes this issue for (DrawableImage di : imagesToDraw) { allPainted &= drawRasters(paintProps, di); } // Need to set repaint based on if drawing // completed. trueColorImage.setRepaint(allPainted == false); + ++i; } } } finally { @@ -140,6 +163,7 @@ public class GLTrueColorImagingExtension extends AbstractGLSLImagingExtension writeToImage = null; } + trueColorImage.setImageParameters(parameters.keySet()); target.drawRasters(paintProps, new DrawableImage(trueColorImage.getWrappedImage(), imageCoverage)); @@ -190,6 +214,7 @@ public class GLTrueColorImagingExtension extends AbstractGLSLImagingExtension GLColormappedImage cmapImage = (GLColormappedImage) image; ColorMapParameters colorMapParameters = cmapImage .getColorMapParameters(); + parameters.put(colorMapParameters, null); int textureType = cmapImage.getTextureType(); // Set the band image data @@ -200,6 +225,7 @@ public class GLTrueColorImagingExtension extends AbstractGLSLImagingExtension program.setUniform("cmapMax", colorMapParameters.getColorMapMax()); program.setUniform("isFloat", textureType == GL.GL_FLOAT || textureType == GL.GL_HALF_FLOAT_ARB ? 1 : 0); + program.setUniform("noDataValue", colorMapParameters.getNoDataValue()); // Set the composite image data program.setUniform("trueColorTexture", 1); @@ -208,6 +234,21 @@ public class GLTrueColorImagingExtension extends AbstractGLSLImagingExtension // Set the band we are rendering to program.setUniform("band", renderingChannel.ordinal()); + program.setUniform("checkAlpha", checkAlpha); + program.setUniform("alphaStep", alphaStep); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#enableBlending + * (javax.media.opengl.GL) + */ + @Override + protected void enableBlending(GL gl) { + // Do not enable blending for this extension as it messes with alpha + // values between passes } } diff --git a/cave/com.raytheon.uf.viz.truecolor.gl/src/com/raytheon/uf/viz/truecolor/gl/image/GLTrueColorImage.java b/cave/com.raytheon.uf.viz.truecolor.gl/src/com/raytheon/uf/viz/truecolor/gl/image/GLTrueColorImage.java index 0ac4aaffdd..6d3a4f6dda 100644 --- a/cave/com.raytheon.uf.viz.truecolor.gl/src/com/raytheon/uf/viz/truecolor/gl/image/GLTrueColorImage.java +++ b/cave/com.raytheon.uf.viz.truecolor.gl/src/com/raytheon/uf/viz/truecolor/gl/image/GLTrueColorImage.java @@ -22,12 +22,16 @@ package com.raytheon.uf.viz.truecolor.gl.image; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; +import java.util.IdentityHashMap; import java.util.Map; import com.raytheon.uf.viz.core.DrawableImage; import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.data.IRenderedImageCallback; +import com.raytheon.uf.viz.core.drawables.ColorMapParameters; +import com.raytheon.uf.viz.core.drawables.IColorMapParametersListener; import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.truecolor.extension.ITrueColorImagingExtension.Channel; @@ -53,7 +57,7 @@ import com.raytheon.viz.core.gl.images.GLImage; */ public class GLTrueColorImage extends GLDelegateImage implements - ITrueColorImage { + ITrueColorImage, IColorMapParametersListener { private static class RGBCallback implements IRenderedImageCallback { private int[] bounds; @@ -77,6 +81,9 @@ public class GLTrueColorImage extends GLDelegateImage implements private Map channelMap = new HashMap(); + /* Identity set used to track color map parameters currently listening on */ + private Map listening = new IdentityHashMap(); + /** * @param extensionClass */ @@ -121,12 +128,15 @@ public class GLTrueColorImage extends GLDelegateImage implements } } - /** - * Get the images for the specified channel + /* + * (non-Javadoc) * - * @param channel - * @return + * @see com.raytheon.uf.viz.truecolor.extension.ITrueColorImagingExtension. + * ITrueColorImage + * #getImages(com.raytheon.uf.viz.truecolor.extension.ITrueColorImagingExtension + * .Channel) */ + @Override public DrawableImage[] getImages(Channel channel) { return channelMap.get(channel); } @@ -177,4 +187,62 @@ public class GLTrueColorImage extends GLDelegateImage implements } } + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IColorMapParametersListener# + * colorMapChanged() + */ + @Override + public void colorMapChanged() { + // Repaint image on colormap change events + repaint = true; + } + + /** + * Sets the ColorMapParameters it's images are using. We add ourselves as + * listeners so we can repaint on changes + * + * @param parameters + */ + public void setImageParameters(Collection parameters) { + boolean same = false; + if (parameters.size() == listening.size()) { + same = true; + for (ColorMapParameters params : parameters) { + same &= listening.containsKey(params); + if (!same) { + break; + } + } + } + if (!same) { + // Current image parameters list different from passed in, set up + // listeners on new set and remove from current set + for (ColorMapParameters params : listening.keySet()) { + params.removeListener(this); + } + listening.clear(); + for (ColorMapParameters params : parameters) { + params.addListener(this); + listening.put(params, null); + } + } + } + + /** + * Returns the number of channels the image is currently using + * + * @return + */ + public int getNumberOfChannels() { + int channels = 0; + for (Channel c : Channel.values()) { + DrawableImage[] images = getImages(c); + if (images != null && images.length > 0) { + ++channels; + } + } + return channels; + } } diff --git a/cave/com.raytheon.uf.viz.truecolor/META-INF/MANIFEST.MF b/cave/com.raytheon.uf.viz.truecolor/META-INF/MANIFEST.MF index 4c789d1c4a..0ed193590b 100644 --- a/cave/com.raytheon.uf.viz.truecolor/META-INF/MANIFEST.MF +++ b/cave/com.raytheon.uf.viz.truecolor/META-INF/MANIFEST.MF @@ -5,7 +5,7 @@ Bundle-SymbolicName: com.raytheon.uf.viz.truecolor;singleton:=true Bundle-Version: 1.0.0.qualifier Bundle-Activator: com.raytheon.uf.viz.truecolor.Activator Bundle-Vendor: RAYTHEON -Eclipse-RegisterBuddy: com.raytheon.uf.viz.core +Eclipse-RegisterBuddy: com.raytheon.uf.viz.core, com.raytheon.viz.ui Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, com.raytheon.uf.viz.core;bundle-version="1.12.1174", diff --git a/cave/com.raytheon.uf.viz.truecolor/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/cave/com.raytheon.uf.viz.truecolor/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject index a9ea6f18bd..692d3292e4 100755 --- a/cave/com.raytheon.uf.viz.truecolor/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ b/cave/com.raytheon.uf.viz.truecolor/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject @@ -1 +1,2 @@ com.raytheon.uf.viz.truecolor.rsc.TrueColorResourceGroupData +com.raytheon.uf.viz.truecolor.rsc.ChannelResource \ No newline at end of file diff --git a/cave/com.raytheon.uf.viz.truecolor/plugin.xml b/cave/com.raytheon.uf.viz.truecolor/plugin.xml index bcc00d3a66..67c6355ec3 100644 --- a/cave/com.raytheon.uf.viz.truecolor/plugin.xml +++ b/cave/com.raytheon.uf.viz.truecolor/plugin.xml @@ -28,4 +28,14 @@ renderingOrderId="IMAGE_COUNTRY" resourceType="PLAN_VIEW"/> + + + diff --git a/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/extension/ITrueColorImagingExtension.java b/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/extension/ITrueColorImagingExtension.java index 8e02a47a8a..12bd4788b9 100644 --- a/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/extension/ITrueColorImagingExtension.java +++ b/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/extension/ITrueColorImagingExtension.java @@ -55,6 +55,8 @@ public interface ITrueColorImagingExtension extends IImagingExtension { public void setImages(Channel channel, DrawableImage... images); + public DrawableImage[] getImages(Channel channel); + public void setSize(int[] bounds); public void setImageExtent(IExtent extent); diff --git a/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/rsc/ChannelResource.java b/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/rsc/ChannelResource.java new file mode 100644 index 0000000000..4f1ce1d6eb --- /dev/null +++ b/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/rsc/ChannelResource.java @@ -0,0 +1,153 @@ +/** + * 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.truecolor.rsc; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; + +import com.raytheon.uf.viz.core.rsc.AbstractResourceData; +import com.raytheon.uf.viz.truecolor.extension.ITrueColorImagingExtension.Channel; + +/** + * Object that represents a resource bound to a {@link Channel} + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Aug 16, 2012            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ +@XmlAccessorType(XmlAccessType.NONE) +public class ChannelResource { + + @XmlElement + protected AbstractResourceData resourceData; + + protected Set channels = new HashSet(); + + @XmlAttribute + protected String channelName; + + /** + * @return the resourceData + */ + public AbstractResourceData getResourceData() { + return resourceData; + } + + /** + * @param resourceData + * the resourceData to set + */ + public void setResourceData(AbstractResourceData resourceData) { + this.resourceData = resourceData; + } + + /** + * @return the channel + */ + @XmlElement(name = "channel") + public Channel[] getChannels() { + return channels.toArray(new Channel[channels.size()]); + } + + /** + * @param channel + * the channel to set + */ + public void setChannels(Channel[] channels) { + if (channels == null) { + channels = new Channel[0]; + } + this.channels = new HashSet(Arrays.asList(channels)); + } + + /** + * @return the channelName + */ + public String getChannelName() { + return channelName; + } + + /** + * @param channelName + * the channelName to set + */ + public void setChannelName(String channelName) { + this.channelName = channelName; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((channelName == null) ? 0 : channelName.hashCode()); + result = prime * result + + ((resourceData == null) ? 0 : resourceData.hashCode()); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ChannelResource other = (ChannelResource) obj; + if (channelName == null) { + if (other.channelName != null) + return false; + } else if (!channelName.equals(other.channelName)) + return false; + if (resourceData == null) { + if (other.resourceData != null) + return false; + } else if (!resourceData.equals(other.resourceData)) + return false; + return true; + } + +} diff --git a/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/rsc/TrueColorResourceGroup.java b/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/rsc/TrueColorResourceGroup.java index 86310416c9..37069e38c3 100644 --- a/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/rsc/TrueColorResourceGroup.java +++ b/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/rsc/TrueColorResourceGroup.java @@ -19,7 +19,12 @@ **/ package com.raytheon.uf.viz.truecolor.rsc; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.eclipse.swt.graphics.Rectangle; import org.opengis.referencing.crs.CoordinateReferenceSystem; @@ -30,6 +35,7 @@ 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.IDescriptor; +import com.raytheon.uf.viz.core.drawables.IDescriptor.FramesInfo; import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension.ImageProvider; @@ -71,6 +77,75 @@ public class TrueColorResourceGroup extends AbstractVizResource implements IResourceGroup, IResourceDataChanged { + public static class DisplayedChannelResource { + + private String displayName; + + public AbstractVizResource resource; + + public ChannelResource channel; + + private DisplayedChannelResource(ChannelResource cr, + AbstractVizResource resource) { + this.channel = cr; + this.resource = resource; + this.displayName = cr.getChannelName(); + if (displayName == null) { + displayName = resource.getName(); + } + } + + /** + * Returns the display name of the channel + * + * @return + */ + public String getDisplayName() { + return displayName; + } + + /** + * Checks if the resource is bound to the specified {@link Channel} + * + * @param channel + * @return + */ + public boolean isChannel(Channel channel) { + return this.channel.channels.contains(channel); + } + + /** + * Removes a channel from being assigned to the resource + * + * @param channel + */ + public void removeChannel(Channel channel) { + this.channel.channels.remove(channel); + } + + /** + * Adds a channel to be assigned to the resource + * + * @param channel + */ + public void addChannel(Channel channel) { + this.channel.channels.add(channel); + } + + /** + * Set the channels to be used by the channel resource + * + * @param channels + */ + public void setChannels(Channel[] channels) { + channel.setChannels(channels); + } + } + + private static final String DEFAULT_NAME = "RGB Composite"; + + private List displayedResources; + private ITrueColorImage image; private boolean timeAgnostic = true; @@ -124,11 +199,18 @@ public class TrueColorResourceGroup extends image.setSize(new int[] { rect.width, rect.height }); image.setImageExtent(extent); + FramesInfo fi = paintProps.getFramesInfo(); for (Channel c : Channel.values()) { - ResourcePair rp = resourceData.getResource(c); - if (rp != null) { - image.setImages(c, getImages(rp, target, paintProps)); + List images = new ArrayList(); + for (DisplayedChannelResource dcr : displayedResources) { + if (dcr.isChannel(c)) { + paintProps.setDataTime(fi.getTimeForResource(dcr.resource)); + images.addAll(dcr.resource + .getCapability(ImagingCapability.class) + .getProvider().getImages(target, paintProps)); + } } + image.setImages(c, images.toArray(new DrawableImage[images.size()])); } Coordinate ul = new Coordinate(extent.getMinX(), extent.getMaxY()); @@ -139,17 +221,6 @@ public class TrueColorResourceGroup extends target.drawRaster(image, new PixelCoverage(ul, ur, lr, ll), paintProps); } - private DrawableImage[] getImages(ResourcePair rp, IGraphicsTarget target, - PaintProperties paintProps) throws VizException { - paintProps.setDataTime(paintProps.getFramesInfo().getTimeForResource( - rp.getResource())); - ImagingCapability imaging = rp.getResource().getCapability( - ImagingCapability.class); - Collection images = imaging.getProvider().getImages( - target, paintProps); - return images.toArray(new DrawableImage[images.size()]); - } - /* * (non-Javadoc) * @@ -172,30 +243,56 @@ public class TrueColorResourceGroup extends // We will name the composite getCapability(GroupNamingCapability.class); - // Initialize them - for (ResourcePair rp : getResourceList()) { - AbstractVizResource resource = rp.getResource(); - resource.init(target); - // Check resource for required capabilities - String error = null; - if (resource.hasCapability(ImagingCapability.class)) { - ImagingCapability imaging = resource - .getCapability(ImagingCapability.class); - if (imaging.getProvider() != null) { - if (resource.hasCapability(ColorMapCapability.class) == false) { - error = "does not have ColorMapCapability"; + displayedResources = new ArrayList(); + ResourceList resources = getResourceList(); + // Make sure multiple resources are not assinged to same channel + Set usedChannels = new HashSet(); + for (ChannelResource cr : resourceData.getChannelResources()) { + for (ResourcePair rp : resources) { + if (cr.getResourceData() == rp.getResourceData()) { + DisplayedChannelResource displayedResource = new DisplayedChannelResource( + cr, rp.getResource()); + AbstractVizResource resource = rp.getResource(); + resource.init(target); + + // Check resource for required capabilities + String error = null; + if (resource.hasCapability(ImagingCapability.class)) { + ImagingCapability imaging = resource + .getCapability(ImagingCapability.class); + if (imaging.getProvider() != null) { + if (resource + .hasCapability(ColorMapCapability.class) == false) { + error = "does not have ColorMapCapability"; + } + } else { + error = "does not have image provider set on the ImagingCapability"; + } + } else { + error = "does not have the ImagingCapability"; } - } else { - error = "does not have image provider set on the ImagingCapability"; + if (error != null) { + Activator.statusHandler.handle(Priority.PROBLEM, + displayedResource.getDisplayName() + + " resource in true color composite " + + error); + resources.remove(rp); + } else { + resource.getResourceData().addChangeListener(this); + // Force channels unique to a single resource + for (Channel c : usedChannels) { + if (displayedResource.isChannel(c)) { + // Notify with INFO message? + displayedResource.removeChannel(c); + } + } + usedChannels + .addAll(Arrays.asList(displayedResource.channel + .getChannels())); + displayedResources.add(displayedResource); + } + break; } - } else { - error = "does not have the ImagingCapability"; - } - if (error != null) { - Activator.statusHandler.handle(Priority.PROBLEM, - resourceData.getCompositeName(rp) - + " resource in true color composite " + error); - resourceData.removeResource(rp); } } @@ -203,16 +300,59 @@ public class TrueColorResourceGroup extends .getExtension(ITrueColorImagingExtension.class); image = ext.initializeRaster(new int[] { 0, 0 }, null); resourceData.addChangeListener(this); + // Set initial ImagingCapability parameters resourceChanged(ChangeType.CAPABILITY, getCapability(ImagingCapability.class)); + // Every resource has to be time agnostic for us to be as well timeAgnostic = true; - for (ResourcePair rp : getResourceList()) { - // If any resource is not time agnostic, neither are we - timeAgnostic &= rp.getResource().isTimeAgnostic(); + for (DisplayedChannelResource dr : displayedResources) { + timeAgnostic &= dr.resource.isTimeAgnostic(); } } + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#getName() + */ + @Override + public String getName() { + String name = resourceData.getGroupName(); + if (name != null) { + name += " "; + } + + if (image != null) { + String productNames = ""; + boolean first = true; + for (Channel c : Channel.values()) { + DrawableImage[] images = image.getImages(c); + if (images != null && images.length > 0) { + name += c.name().substring(0, 1); + if (!first) { + productNames += "/"; + } + for (DisplayedChannelResource rsc : displayedResources) { + if (rsc.isChannel(c)) { + productNames += rsc.getDisplayName(); + break; + } + } + first = false; + } + } + if (first == true) { + name += DEFAULT_NAME; + } else { + name += ": " + productNames; + } + } else { + name += DEFAULT_NAME; + } + return name; + } + /* * (non-Javadoc) * @@ -245,6 +385,10 @@ public class TrueColorResourceGroup extends image.setInterpolated(imaging.isInterpolationState()); } } + issueRefresh(); } + public Collection getChannelResources() { + return displayedResources; + } } diff --git a/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/rsc/TrueColorResourceGroupData.java b/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/rsc/TrueColorResourceGroupData.java index 9f4e13c5e4..58e0d65221 100644 --- a/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/rsc/TrueColorResourceGroupData.java +++ b/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/rsc/TrueColorResourceGroupData.java @@ -19,19 +19,22 @@ **/ package com.raytheon.uf.viz.truecolor.rsc; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import com.raytheon.uf.viz.core.drawables.IDescriptor; import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.rsc.AbstractNameGenerator; import com.raytheon.uf.viz.core.rsc.AbstractResourceData; import com.raytheon.uf.viz.core.rsc.AbstractVizResource; import com.raytheon.uf.viz.core.rsc.IResourceGroup; import com.raytheon.uf.viz.core.rsc.LoadProperties; import com.raytheon.uf.viz.core.rsc.ResourceList; import com.raytheon.uf.viz.core.rsc.ResourceProperties; -import com.raytheon.uf.viz.truecolor.extension.ITrueColorImagingExtension.Channel; /** * {@link TrueColorResourceGroup} resource data. Contains a red/blue/green @@ -51,7 +54,7 @@ import com.raytheon.uf.viz.truecolor.extension.ITrueColorImagingExtension.Channe * @author mschenke * @version 1.0 */ - +@XmlAccessorType(XmlAccessType.NONE) public class TrueColorResourceGroupData extends AbstractResourceData implements IResourceGroup { @@ -60,23 +63,8 @@ public class TrueColorResourceGroupData extends AbstractResourceData implements @XmlElement private String groupName; - @XmlElement - private AbstractResourceData redChannelResource; - - @XmlElement - private AbstractResourceData greenChannelResource; - - @XmlElement - private AbstractResourceData blueChannelResource; - - public TrueColorResourceGroupData() { - nameGenerator = new AbstractNameGenerator() { - @Override - public String getName(AbstractVizResource resource) { - return groupName; - } - }; - } + @XmlElement(name = "channelResource") + private List channelResources; /* * (non-Javadoc) @@ -87,81 +75,25 @@ public class TrueColorResourceGroupData extends AbstractResourceData implements public ResourceList getResourceList() { if (resourceList == null) { resourceList = new ResourceList(); - // Initialize the resource list, if any of the resources equal each - // other, replace with reference instead of copy to save memory - if (redChannelResource != null) { - addResource(redChannelResource); - } - if (greenChannelResource != null) { - if (greenChannelResource.equals(redChannelResource)) { - greenChannelResource = redChannelResource; - } else { - addResource(greenChannelResource); - } - } - if (blueChannelResource != null) { - if (blueChannelResource.equals(redChannelResource)) { - blueChannelResource = redChannelResource; - } else if (blueChannelResource.equals(greenChannelResource)) { - blueChannelResource = greenChannelResource; - } else { - addResource(blueChannelResource); + // Removes duplicate resources + List added = new ArrayList( + channelResources.size()); + for (ChannelResource resource : channelResources) { + if (addResource(resource.getResourceData())) { + added.add(resource); } + channelResources = added; } } return resourceList; } - private void addResource(AbstractResourceData resourceData) { + private boolean addResource(AbstractResourceData resourceData) { ResourcePair rp = new ResourcePair(); rp.setResourceData(resourceData); rp.setLoadProperties(new LoadProperties()); rp.setProperties(new ResourceProperties()); - resourceList.add(rp); - } - - /** - * Removes a resource from the resource data - * - * @param rp - */ - public void removeResource(ResourcePair rp) { - resourceList.remove(rp); - if (rp.getResourceData() == redChannelResource) { - redChannelResource = null; - } - if (rp.getResourceData() == greenChannelResource) { - greenChannelResource = null; - } - if (rp.getResourceData() == blueChannelResource) { - blueChannelResource = null; - } - } - - /** - * Get the composite name of the resource pair (Red, Red/Green, Blue, etc) - * - * @param rp - * @return - */ - public String getCompositeName(ResourcePair rp) { - String name = ""; - if (rp.getResourceData() == redChannelResource) { - name += "Red"; - } - if (rp.getResourceData() == greenChannelResource) { - if (name.isEmpty() == false) { - name += "/"; - } - name += "Green"; - } - if (rp.getResourceData() == blueChannelResource) { - if (name.isEmpty() == false) { - name += "/"; - } - name += "Blue"; - } - return name; + return resourceList.add(rp); } /* @@ -190,33 +122,6 @@ public class TrueColorResourceGroupData extends AbstractResourceData implements // Nothing to update, updates will be handled by sub resources } - /** - * Get the resource pair associated with the {@link Channel} - * - * @param channel - * @return - */ - public ResourcePair getResource(Channel channel) { - AbstractResourceData toCheckFor = null; - switch (channel) { - case RED: - toCheckFor = redChannelResource; - break; - case GREEN: - toCheckFor = greenChannelResource; - break; - case BLUE: - toCheckFor = blueChannelResource; - break; - } - for (ResourcePair rp : getResourceList()) { - if (rp.getResourceData() == toCheckFor) { - return rp; - } - } - return null; - } - /** * @return the groupName */ @@ -233,49 +138,18 @@ public class TrueColorResourceGroupData extends AbstractResourceData implements } /** - * @return the redChannelResource + * @return the channelResources */ - public AbstractResourceData getRedChannelResource() { - return redChannelResource; + public List getChannelResources() { + return channelResources; } /** - * @param redChannelResource - * the redChannelResource to set + * @param channelResources + * the channelResources to set */ - public void setRedChannelResource(AbstractResourceData redChannelResource) { - this.redChannelResource = redChannelResource; - } - - /** - * @return the greenChannelResource - */ - public AbstractResourceData getGreenChannelResource() { - return greenChannelResource; - } - - /** - * @param greenChannelResource - * the greenChannelResource to set - */ - public void setGreenChannelResource( - AbstractResourceData greenChannelResource) { - this.greenChannelResource = greenChannelResource; - } - - /** - * @return the blueChannelResource - */ - public AbstractResourceData getBlueChannelResource() { - return blueChannelResource; - } - - /** - * @param blueChannelResource - * the blueChannelResource to set - */ - public void setBlueChannelResource(AbstractResourceData blueChannelResource) { - this.blueChannelResource = blueChannelResource; + public void setChannelResources(List channelResources) { + this.channelResources = channelResources; } /* @@ -292,26 +166,16 @@ public class TrueColorResourceGroupData extends AbstractResourceData implements if (getClass() != obj.getClass()) return false; TrueColorResourceGroupData other = (TrueColorResourceGroupData) obj; - if (blueChannelResource == null) { - if (other.blueChannelResource != null) + if (channelResources == null) { + if (other.channelResources != null) return false; - } else if (!blueChannelResource.equals(other.blueChannelResource)) - return false; - if (greenChannelResource == null) { - if (other.greenChannelResource != null) - return false; - } else if (!greenChannelResource.equals(other.greenChannelResource)) + } else if (!channelResources.equals(other.channelResources)) return false; if (groupName == null) { if (other.groupName != null) return false; } else if (!groupName.equals(other.groupName)) return false; - if (redChannelResource == null) { - if (other.redChannelResource != null) - return false; - } else if (!redChannelResource.equals(other.redChannelResource)) - return false; return true; } diff --git a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/dialogs/MultiChannelDialog.java b/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/ui/TrueColorDialog.java similarity index 51% rename from cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/dialogs/MultiChannelDialog.java rename to cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/ui/TrueColorDialog.java index fb9b102f7d..2028847d42 100644 --- a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/dialogs/MultiChannelDialog.java +++ b/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/ui/TrueColorDialog.java @@ -17,9 +17,12 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.viz.ui.dialogs; +package com.raytheon.uf.viz.truecolor.ui; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -33,17 +36,22 @@ import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import com.raytheon.uf.viz.core.drawables.ColorMapParameters; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.Channel; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.ChannelData; import com.raytheon.uf.viz.core.rsc.AbstractVizResource; -import com.raytheon.uf.viz.core.rsc.capabilities.MultiChannelCapability; +import com.raytheon.uf.viz.core.rsc.IDisposeListener; +import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; +import com.raytheon.uf.viz.truecolor.extension.ITrueColorImagingExtension.Channel; +import com.raytheon.uf.viz.truecolor.rsc.TrueColorResourceGroup; +import com.raytheon.uf.viz.truecolor.rsc.TrueColorResourceGroup.DisplayedChannelResource; +import com.raytheon.viz.ui.dialogs.CaveSWTDialog; +import com.raytheon.viz.ui.dialogs.ColorMapSliderComp; /** - * Dialog for manipulating multi channel capability + * Dialog for modifying true color attributes on a dialog + * + * TODO: Update sliders when combo changes * *
  * 
@@ -51,7 +59,7 @@ import com.raytheon.uf.viz.core.rsc.capabilities.MultiChannelCapability;
  * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
- * Jan 3, 2012            mschenke     Initial creation
+ * Aug 16, 2012            mschenke     Initial creation
  * 
  * 
* @@ -59,29 +67,52 @@ import com.raytheon.uf.viz.core.rsc.capabilities.MultiChannelCapability; * @version 1.0 */ -public class MultiChannelDialog extends CaveSWTDialog { +public class TrueColorDialog extends CaveSWTDialog implements IDisposeListener { private static final String DISABLED = "Disabled"; - private AbstractVizResource resource; - - private MultiChannelCapability capability; - - private String[] items; + protected TrueColorResourceGroup resource; private List sliderComps; - public MultiChannelDialog(Shell parent, AbstractVizResource resource, - MultiChannelCapability capability) { - super(parent); - this.capability = capability; + private Map resourceMap; + + private Map resourceChannelMap; + + private Map originalChannelMap; + + /** + * Creates the TrueColorDialog as a window of the parent Shell + * + * @param parent + * @param resource + */ + public TrueColorDialog(Shell parent, TrueColorResourceGroup resource) { + super(parent, SWT.DIALOG_TRIM); this.resource = resource; - String[] names = capability.getNames(); - this.items = new String[names.length + 1]; - System.arraycopy(names, 0, items, 1, names.length); - items[0] = DISABLED; this.sliderComps = new ArrayList(); - setText("Channel Options"); + this.resourceMap = new LinkedHashMap(); + this.resourceChannelMap = new HashMap(); + this.originalChannelMap = new HashMap(); + setText("Composite Options"); + populateItemMap(resource.getChannelResources()); + resource.registerListener(this); + } + + /** + * @param channelResources + */ + private void populateItemMap( + Collection channelResources) { + resourceMap.put(DISABLED, null); + for (DisplayedChannelResource rsc : channelResources) { + Channel[] channels = rsc.channel.getChannels(); + resourceMap.put(rsc.getDisplayName(), rsc); + originalChannelMap.put(rsc, channels); + for (Channel c : channels) { + resourceChannelMap.put(c, rsc); + } + } } /* @@ -93,9 +124,8 @@ public class MultiChannelDialog extends CaveSWTDialog { */ @Override protected void initializeComponents(Shell shell) { - Map channelMap = capability.getChannelMap(); for (Channel c : Channel.values()) { - addGroup(shell, c, channelMap.get(c)); + addGroup(shell, c, resourceChannelMap.get(c)); } Composite buttonComp = new Composite(shell, SWT.NONE); @@ -129,17 +159,23 @@ public class MultiChannelDialog extends CaveSWTDialog { b.setLayoutData(gd); } - private void addGroup(Composite parent, Channel channel, - final ChannelData data) { + /** + * @param shell + * @param c + * @param displayedChannelResource + */ + private void addGroup(Composite parent, final Channel channel, + DisplayedChannelResource displayedResource) { ColorMapParameters params = null; - if (data != null) { - params = data.parameters; + if (displayedResource != null) { + params = displayedResource.resource.getCapability( + ColorMapCapability.class).getColorMapParameters(); } else { params = new ColorMapParameters(); } Group group = new Group(parent, SWT.SHADOW_ETCHED_IN); - group.setLayout(new GridLayout(4, false)); + group.setLayout(new GridLayout(2, false)); group.setText(channel + ":"); group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true)); final ColorMapSliderComp cmapSlider = new ColorMapSliderComp(group, @@ -147,53 +183,32 @@ public class MultiChannelDialog extends CaveSWTDialog { cmapSlider.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); sliderComps.add(cmapSlider); - final Button invertBtn = new Button(group, SWT.CHECK); - invertBtn.addSelectionListener(new SelectionAdapter() { - /* - * (non-Javadoc) - * - * @see - * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse - * .swt.events.SelectionEvent) - */ - @Override - public void widgetSelected(SelectionEvent e) { - data.invert = invertBtn.getSelection(); - resource.issueRefresh(); - } - }); - - if (data != null) { - invertBtn.setSelection(data.invert); - } - - Label label = new Label(group, SWT.NONE); - label.setText("Invert"); - final Combo options = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY); options.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false)); - options.setItems(items); - if (data == null) { + options.setItems(resourceMap.keySet().toArray( + new String[resourceMap.size()])); + if (displayedResource == null) { options.setText(DISABLED); enable(group, false); } else { - if (data.name == null) { - options.setText(DISABLED); - enable(cmapSlider, false); - } else { - options.setText(data.name); - } + options.setText(displayedResource.getDisplayName()); options.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - if (DISABLED.equals(options.getText())) { - enable(cmapSlider, false); - data.name = null; - } else { - enable(cmapSlider, true); - data.name = options.getText(); + DisplayedChannelResource channelResource = resourceMap + .get(options.getText()); + enable(cmapSlider, channelResource != null); + DisplayedChannelResource oldResource = resourceChannelMap + .put(channel, channelResource); + if (oldResource != null) { + oldResource.removeChannel(channel); } - capability.capabilityChanged(); + if (channelResource != null) { + channelResource.addChannel(channel); + // TODO: Update slider? + } + + resource.issueRefresh(); } }); } @@ -203,10 +218,37 @@ public class MultiChannelDialog extends CaveSWTDialog { for (ColorMapSliderComp cmapSlider : sliderComps) { cmapSlider.restore(); } + for (DisplayedChannelResource rsc : originalChannelMap.keySet()) { + rsc.setChannels(originalChannelMap.get(rsc)); + } close(); } private void okPressed() { close(); } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.rsc.IDisposeListener#disposed(com.raytheon.uf + * .viz.core.rsc.AbstractVizResource) + */ + @Override + public void disposed(AbstractVizResource rsc) { + close(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.ui.dialogs.CaveSWTDialogBase#disposed() + */ + @Override + protected void disposed() { + super.disposed(); + resource.unregisterListener(this); + } + } diff --git a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/cmenu/MultiChannelImagingAction.java b/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/ui/TrueColorDialogAction.java similarity index 52% rename from cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/cmenu/MultiChannelImagingAction.java rename to cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/ui/TrueColorDialogAction.java index 1f30ae6df7..773fa96389 100644 --- a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/cmenu/MultiChannelImagingAction.java +++ b/cave/com.raytheon.uf.viz.truecolor/src/com/raytheon/uf/viz/truecolor/ui/TrueColorDialogAction.java @@ -17,7 +17,10 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.viz.ui.cmenu; +package com.raytheon.uf.viz.truecolor.ui; + +import java.util.HashMap; +import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Event; @@ -25,14 +28,11 @@ import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; -import com.raytheon.uf.viz.core.rsc.AbstractVizResource; -import com.raytheon.uf.viz.core.rsc.IDisposeListener; -import com.raytheon.uf.viz.core.rsc.capabilities.MultiChannelCapability; -import com.raytheon.viz.ui.dialogs.MultiChannelDialog; +import com.raytheon.uf.viz.truecolor.rsc.TrueColorResourceGroup; +import com.raytheon.viz.ui.cmenu.AbstractRightClickAction; /** - * Right click action that opens a dialog for modifying resources with - * MultiChannelCapability + * TODO Add Description * *
  * 
@@ -40,7 +40,7 @@ import com.raytheon.viz.ui.dialogs.MultiChannelDialog;
  * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
- * Jan 3, 2012            mschenke     Initial creation
+ * Aug 16, 2012            mschenke     Initial creation
  * 
  * 
* @@ -48,7 +48,9 @@ import com.raytheon.viz.ui.dialogs.MultiChannelDialog; * @version 1.0 */ -public class MultiChannelImagingAction extends AbstractRightClickAction { +public class TrueColorDialogAction extends AbstractRightClickAction { + + private static Map dialogMap = new HashMap(); /* * (non-Javadoc) @@ -57,7 +59,7 @@ public class MultiChannelImagingAction extends AbstractRightClickAction { */ @Override public String getText() { - return "Channel Options..."; + return "Composite Options..."; } /* @@ -67,26 +69,22 @@ public class MultiChannelImagingAction extends AbstractRightClickAction { */ @Override public void run() { - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow() - .getShell(); - final AbstractVizResource rsc = getSelectedRsc(); - MultiChannelCapability cap = rsc - .getCapability(MultiChannelCapability.class); - final MultiChannelDialog dialog = new MultiChannelDialog(shell, rsc, - cap); - final IDisposeListener listener = new IDisposeListener() { - @Override - public void disposed(AbstractVizResource rsc) { - dialog.close(); - } - }; - rsc.registerListener(listener); - dialog.addListener(SWT.Dispose, new Listener() { - @Override - public void handleEvent(Event event) { - rsc.unregisterListener(listener); - } - }); + TrueColorResourceGroup resource = (TrueColorResourceGroup) getSelectedRsc(); + TrueColorDialog dialog = dialogMap.get(resource); + if (dialog == null) { + Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow() + .getShell(); + dialog = new TrueColorDialog(shell, resource); + final TrueColorDialog toRemove = dialog; + dialogMap.put(resource, dialog); + dialog.addListener(SWT.Close, new Listener() { + @Override + public void handleEvent(Event event) { + dialogMap.remove(toRemove.resource); + } + }); + } dialog.open(); } + } diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl/colormapRaster.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl/colormapRaster.glsl index f57ef22a4f..611851ddf7 100644 --- a/cave/com.raytheon.viz.core.gl/localization/glsl/colormapRaster.glsl +++ b/cave/com.raytheon.viz.core.gl/localization/glsl/colormapRaster.glsl @@ -36,7 +36,7 @@ void main(void) { } } else { float naturalValue = ((rawValue * (naturalMax - naturalMin)) + naturalMin); - index = capIndex(findIndex(naturalValue, cmapMin, cmapMax)); + index = findIndex(naturalValue, cmapMin, cmapMax); } // Lookup color in colorMap for index 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 index ed8a0e7c88..151107d561 100644 --- a/cave/com.raytheon.viz.core.gl/localization/glsl/include/indexing.glsl +++ b/cave/com.raytheon.viz.core.gl/localization/glsl/include/indexing.glsl @@ -96,9 +96,9 @@ float findFloatIndexLog(float rawValue, float cmapMin, float cmapMax, int mirror } /** - * Given a raw data value linearly determine the index into cmapMin/cmapMax. - * Index is not capped and may be outsite of 0-1 + * Given a raw data value linearly determine the index(0-1) into cmapMin/cmapMax */ float findIndex(float rawValue, float cmapMin, float cmapMax) { - return ((rawValue - cmapMin) / abs(cmapMax-cmapMin)); + float index = ((rawValue - cmapMin) / abs(cmapMax-cmapMin)); + return capIndex(index); } diff --git a/cave/com.raytheon.viz.core.gl/localization/glsl/multichannel.glsl b/cave/com.raytheon.viz.core.gl/localization/glsl/multichannel.glsl deleted file mode 100644 index c3d80011b5..0000000000 --- a/cave/com.raytheon.viz.core.gl/localization/glsl/multichannel.glsl +++ /dev/null @@ -1,70 +0,0 @@ -#include -#include - -uniform float alpha; -uniform float brightness; -uniform float contrast; - -uniform sampler2D rawTexR; -uniform float naturalMinR; -uniform float naturalMaxR; -uniform float cmapMinR; -uniform float cmapMaxR; -uniform int isFloatR; -uniform int invertR; -uniform int applyR; - -uniform sampler2D rawTexG; -uniform float naturalMinG; -uniform float naturalMaxG; -uniform float cmapMinG; -uniform float cmapMaxG; -uniform int isFloatG; -uniform int invertG; -uniform int applyG; - -uniform sampler2D rawTexB; -uniform float naturalMinB; -uniform float naturalMaxB; -uniform float cmapMinB; -uniform float cmapMaxB; -uniform int isFloatB; -uniform int invertB; -uniform int applyB; - - -float getIndex(sampler2D rawTex, float cmapMin, float cmapMax, float naturalMin, float naturalMax, int isFloat) { - vec4 textureValue = texture2D(rawTex, gl_TexCoord[0].st); - float naturalVal = textureValue.r; - if ( isFloat == 0 ) { - naturalVal = ((naturalVal * (naturalMax - naturalMin)) + naturalMin); - } - return findIndex(naturalVal, cmapMin, cmapMax); -} - -void main(void) { - float r = 0.0; - float g = 0.0; - float b = 0.0; - - if ( applyR != 0 ) { - r = getIndex(rawTexR, cmapMinR, cmapMaxR, naturalMinR, naturalMaxR, isFloatR); - if ( invertR != 0 ) { - r = 1.0 - r; - } - } - if ( applyG != 0 ) { - g = getIndex(rawTexG, cmapMinG, cmapMaxG, naturalMinG, naturalMaxG, isFloatG); - if ( invertG != 0 ) { - g = 1.0 - g; - } - } - if ( applyB != 0 ) { - b = getIndex(rawTexB, cmapMinB, cmapMaxB, naturalMinB, naturalMaxB, isFloatB); - if ( invertB != 0 ) { - b = 1.0 - b; - } - } - - gl_FragColor = applyContrastAlphaBrightness(vec4(r,g,b,alpha), alpha, brightness, contrast); -} diff --git a/cave/com.raytheon.viz.core.gl/plugin.xml b/cave/com.raytheon.viz.core.gl/plugin.xml index 112cdc147f..41ff5356f2 100644 --- a/cave/com.raytheon.viz.core.gl/plugin.xml +++ b/cave/com.raytheon.viz.core.gl/plugin.xml @@ -53,9 +53,6 @@ - - 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 index 1564719238..97ec3fa915 100644 --- 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 @@ -91,7 +91,7 @@ public abstract class AbstractGLImagingExtension extends 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); + disableBlending(gl); } finally { target.popGLState(); } @@ -159,14 +159,7 @@ public abstract class AbstractGLImagingExtension extends 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); - + enableBlending(gl); gl.glColor4f(0.0f, 0.0f, 0.0f, paintProps.getAlpha()); } @@ -311,6 +304,27 @@ public abstract class AbstractGLImagingExtension extends return PaintStatus.ERROR; } + /** + * Function to enable blending for images + * + * @param gl + */ + protected void enableBlending(GL gl) { + 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); + } + + /** + * Function to disable blending for images + * + * @param gl + */ + protected void disableBlending(GL gl) { + gl.glDisable(GL.GL_BLEND); + } + /** * Setup anything that is required pre image rendering. Object returned is a * state object and will be passed in to postImageRender. If the image 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 fc757497a6..859735f588 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 @@ -209,7 +209,10 @@ public class GLShaderProgram { * @param value */ private void setUniformInternal(String uniformName, Object value) { - if (value instanceof Float) { + if (value instanceof Double) { + gl.glUniform1f(getUniformLocation(uniformName), + ((Double) value).floatValue()); + } else if (value instanceof Float) { gl.glUniform1f(getUniformLocation(uniformName), (Float) value); } else if (value instanceof Integer) { gl.glUniform1i(getUniformLocation(uniformName), (Integer) value); diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImageChannel.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImageChannel.java deleted file mode 100644 index 8145723aa1..0000000000 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImageChannel.java +++ /dev/null @@ -1,113 +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.images; - -import com.raytheon.uf.viz.core.drawables.ColorMapParameters; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.ChannelData; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.IImageChannel; -import com.raytheon.viz.core.gl.internal.ext.GLMultiChannelImageExtension; - -/** - * GL implementation of {@link IImageChannel} - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Feb 9, 2012            mschenke     Initial creation
- * 
- * 
- * - * @author mschenke - * @version 1.0 - */ - -public class GLImageChannel extends GLDelegateImage - implements IImageChannel { - - private ChannelData channelData; - - /** - * @param target - * @param image - * @param extensionClass - */ - public GLImageChannel(GLColormappedImage image, ChannelData channelData) { - super(image, GLMultiChannelImageExtension.class); - this.channelData = channelData; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.drawables.IColormappedImage#getColorMapParameters - * () - */ - @Override - public ColorMapParameters getColorMapParameters() { - return image.getColorMapParameters(); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.drawables.IColormappedImage#setColorMapParameters - * (com.raytheon.uf.viz.core.drawables.ColorMapParameters) - */ - @Override - public void setColorMapParameters(ColorMapParameters params) { - image.setColorMapParameters(params); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.drawables.IColormappedImage#getValue(int, - * int) - */ - @Override - public double getValue(int x, int y) { - return image.getValue(x, y); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension - * .IChannelImage#setInvert(boolean) - */ - @Override - public void setInverted(boolean inverted) { - channelData.invert = inverted; - } - - /** - * @return the invert - */ - public boolean isInverted() { - return channelData.invert; - } - -} diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLMultiChannelImage.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLMultiChannelImage.java deleted file mode 100644 index d3f90a2006..0000000000 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLMultiChannelImage.java +++ /dev/null @@ -1,262 +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.images; - -import java.util.Map; - -import javax.media.opengl.GL; - -import com.raytheon.uf.viz.core.drawables.IColormappedImage; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.Channel; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.IImageChannel; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.IMultiChannelImage; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.gl.IGLTarget; -import com.raytheon.viz.core.gl.internal.ext.GLMultiChannelImageExtension; -import com.sun.opengl.util.texture.TextureCoords; - -/** - * GL implementation of a multi channel image - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Dec 19, 2011            mschenke     Initial creation
- * 
- * 
- * - * @author mschenke - * @version 1.0 - */ - -public class GLMultiChannelImage extends AbstractGLImage implements - IMultiChannelImage { - - private Map channelMap; - - /** - * @param target - * @param extensionClass - */ - public GLMultiChannelImage(IGLTarget target, - Map channelMap) { - super(GLMultiChannelImageExtension.class); - this.channelMap = channelMap; - } - - /** - * Get the first IColormappedImage in the map - * - * @return first image in the map or null if none - */ - private IColormappedImage getFirstImage() { - if (channelMap != null) { - for (IColormappedImage image : channelMap.values()) { - if (image != null) { - return image; - } - } - } - return null; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.gl.images.AbstractGLImage#setInterpolated(boolean) - */ - @Override - public void setInterpolated(boolean isInterpolated) { - super.setInterpolated(isInterpolated); - for (IColormappedImage image : channelMap.values()) { - ((AbstractGLImage) image).setInterpolated(isInterpolated); - } - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.drawables.IImage#getWidth() - */ - @Override - public int getWidth() { - IColormappedImage image = getFirstImage(); - if (image != null) { - return image.getWidth(); - } - return 0; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.drawables.IImage#getHeight() - */ - @Override - public int getHeight() { - IColormappedImage image = getFirstImage(); - if (image != null) { - return image.getHeight(); - } - return 0; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension - * .IMultiChannelImage#getImageMapping() - */ - @Override - public Map getImageMapping() { - return channelMap; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension - * .IMultiChannelImage#setImageMapping(java.util.Map) - */ - @Override - public void setImageMapping(Map mapping) { - this.channelMap = mapping; - // Set ourselves as unloaded since we are updating the mapping - setStatus(Status.UNLOADED); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.images.AbstractGLImage#getTextureCoords() - */ - @Override - public TextureCoords getTextureCoords() { - return new TextureCoords(0, 1, 1, 0); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.images.AbstractGLImage#getTextureid() - */ - @Override - public int getTextureid() { - // We do not have a single textureid specifically - return 0; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.gl.images.AbstractGLImage#getTextureStorageType() - */ - @Override - public int getTextureStorageType() { - AbstractGLImage image = (AbstractGLImage) getFirstImage(); - return image.getTextureStorageType(); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.images.AbstractGLImage#stage() - */ - @Override - public boolean stageTexture() throws VizException { - boolean rval = false; - if (channelMap.size() > 0) { - rval = true; - for (IColormappedImage image : channelMap.values()) { - AbstractGLImage glImage = (AbstractGLImage) image; - glImage.stage(); - if (glImage.getStatus() == Status.FAILED) { - rval = false; - } - } - } - return rval; - } - - @Override - public void loadTexture(GL gl) throws VizException { - if (channelMap.size() > 0) { - Status status = Status.LOADED; - for (IColormappedImage image : channelMap.values()) { - AbstractGLImage glImage = (AbstractGLImage) image; - glImage.loadTexture(gl); - if (glImage.getStatus() == Status.FAILED) { - status = Status.FAILED; - } - } - setStatus(status); - } - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.images.AbstractGLImage#dispose() - */ - @Override - public void dispose() { - for (IColormappedImage image : channelMap.values()) { - ((AbstractGLImage) image).dispose(); - } - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.images.AbstractGLImage#bind() - */ - @Override - public boolean bind(GL gl) { - return true; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.images.AbstractGLImage#bind(int) - */ - @Override - public boolean bind(GL gl, int texture) { - return true; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.images.AbstractGLImage#usaAsFrameBuffer() - */ - @Override - public void usaAsFrameBuffer() throws VizException { - throw new VizException( - "Using a GLMultiChannelImage as a frame buffer is not supported"); - } -} diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLMultiChannelImageExtension.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLMultiChannelImageExtension.java deleted file mode 100644 index 543ef2e0ea..0000000000 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/GLMultiChannelImageExtension.java +++ /dev/null @@ -1,184 +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.internal.ext; - -import java.util.Map; - -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.IImage; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension; -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.GLImageChannel; -import com.raytheon.viz.core.gl.images.GLMultiChannelImage; - -/** - * GL implementation of {@link IMultiChannelImageExtension} - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Dec 19, 2011            mschenke     Initial creation
- * 
- * 
- * - * @author mschenke - * @version 1.0 - */ - -public class GLMultiChannelImageExtension extends AbstractGLSLImagingExtension - implements IMultiChannelImageExtension { - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension - * #constructImage(java.util.Map) - */ - @Override - public IMultiChannelImage constructImage( - Map imageMapping) throws VizException { - return new GLMultiChannelImage(target, imageMapping); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension - * # - * constructImage(com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback - * , com.raytheon.uf.viz.core.drawables.ColorMapParameters) - */ - @Override - public IImageChannel constructImage( - IColorMapDataRetrievalCallback callback, ChannelData channelData) - throws VizException { - return new GLImageChannel(target.getExtension( - GLColormappedImageExtension.class).initializeRaster(callback, - channelData.parameters), channelData); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.gl.ext.AbstractGLImagingExtension#getShaderProgramName - * () - */ - @Override - public String getShaderProgramName() { - return "multichannel"; - } - - /* - * (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 { - GLMultiChannelImage glImage = null; - if (image instanceof GLMultiChannelImage == false) { - throw new VizException( - "Cannot apply glsl multichannel shader to non gl multichannel image"); - } - glImage = (GLMultiChannelImage) image; - Map channelMap = glImage.getImageMapping(); - - program.setUniform("brightness", glImage.getBrightness()); - program.setUniform("contrast", glImage.getContrast()); - program.setUniform("alpha", paintProps.getAlpha()); - - for (Channel c : Channel.values()) { - String suffix = ""; - int texture = -1; - int texNum = -1; - switch (c) { - case RED: - suffix = "R"; - texture = GL.GL_TEXTURE0; - texNum = 0; - break; - case GREEN: - suffix = "G"; - texture = GL.GL_TEXTURE1; - texNum = 1; - break; - case BLUE: - suffix = "B"; - texture = GL.GL_TEXTURE2; - texNum = 2; - break; - } - - boolean applied = false; - IColormappedImage ci = channelMap.get(c); - if (ci != null) { - if (ci instanceof GLImageChannel == false) { - throw new VizException( - "Cannot apply glsl multichannel shader to non gl colormapped image"); - } - GLImageChannel glCMImage = (GLImageChannel) ci; - if (glCMImage.bind(target.getGl(), texture)) { - int textureType = glCMImage.getWrappedImage() - .getTextureType(); - - ColorMapParameters colorMapParameters = ci - .getColorMapParameters(); - - program.setUniform("rawTex" + suffix, texNum); - program.setUniform("naturalMin" + suffix, - colorMapParameters.getDataMin()); - program.setUniform("naturalMax" + suffix, - colorMapParameters.getDataMax()); - program.setUniform("cmapMin" + suffix, - colorMapParameters.getColorMapMin()); - program.setUniform("cmapMax" + suffix, - colorMapParameters.getColorMapMax()); - program.setUniform("isFloat" + suffix, - textureType == GL.GL_FLOAT - || textureType == GL.GL_HALF_FLOAT_ARB ? 1 - : 0); - program.setUniform("invert" + suffix, - glCMImage.isInverted()); - applied = true; - } - } - program.setUniform("apply" + suffix, applied ? 1 : 0); - } - } - -} diff --git a/cave/com.raytheon.viz.satellite/plugin.xml b/cave/com.raytheon.viz.satellite/plugin.xml index 2f9a6ecf4c..9c4b5ae2a6 100644 --- a/cave/com.raytheon.viz.satellite/plugin.xml +++ b/cave/com.raytheon.viz.satellite/plugin.xml @@ -31,11 +31,6 @@ class="com.raytheon.viz.satellite.rsc.SatBlendedResource" name="satBlendedResource" renderingOrderId="IMAGE_COUNTRY"/> - diff --git a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatTrueColorResource.java b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatTrueColorResource.java deleted file mode 100644 index e2f24081fa..0000000000 --- a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatTrueColorResource.java +++ /dev/null @@ -1,489 +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.satellite.rsc; - -import java.nio.ByteBuffer; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import org.geotools.coverage.grid.GridGeometry2D; -import org.opengis.referencing.crs.CoordinateReferenceSystem; - -import com.raytheon.uf.common.dataplugin.PluginDataObject; -import com.raytheon.uf.common.dataplugin.satellite.SatelliteRecord; -import com.raytheon.uf.common.datastorage.DataStoreFactory; -import com.raytheon.uf.common.datastorage.IDataStore; -import com.raytheon.uf.common.datastorage.Request; -import com.raytheon.uf.common.datastorage.records.ByteDataRecord; -import com.raytheon.uf.common.geospatial.ISpatialObject; -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; -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.PixelCoverage; -import com.raytheon.uf.viz.core.RecordFactory; -import com.raytheon.uf.viz.core.VizApp; -import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; -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.IRenderable; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.Channel; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.ChannelData; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.IImageChannel; -import com.raytheon.uf.viz.core.drawables.ext.colormap.IMultiChannelImageExtension.IMultiChannelImage; -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.AbstractPluginDataObjectResource; -import com.raytheon.uf.viz.core.rsc.IResourceDataChanged.ChangeType; -import com.raytheon.uf.viz.core.rsc.LoadProperties; -import com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability; -import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; -import com.raytheon.uf.viz.core.rsc.capabilities.MultiChannelCapability; -import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile; -import com.vividsolutions.jts.geom.Coordinate; - -/** - * True color satellite resource - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Dec 20, 2011            mschenke     Initial creation
- * 
- * 
- * - * @author mschenke - * @version 1.0 - */ -public class SatTrueColorResource - extends - AbstractPluginDataObjectResource - implements IColorMapParametersListener { - - private static final IUFStatusHandler statusHandler = UFStatus - .getHandler(SatTrueColorResource.class); - - private static final String NAME = "Sat True Color"; - - private static class SatelliteDataRetriever implements - IColorMapDataRetrievalCallback { - - private SatelliteRecord record; - - private boolean signed; - - public SatelliteDataRetriever(SatelliteRecord record, boolean signed) { - this.record = record; - this.signed = signed; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback# - * getColorMapData() - */ - @Override - public ColorMapData getColorMapData() throws VizException { - ColorMapDataType dataType = signed ? ColorMapDataType.SIGNED_BYTE - : ColorMapDataType.BYTE; - IDataStore ds = DataStoreFactory.getDataStore(HDF5Util - .findHDF5Location(record)); - try { - ISpatialObject so = record.getSpatialObject(); - ByteBuffer bb = ByteBuffer.wrap(((ByteDataRecord) ds.retrieve( - record.getDataURI(), "Data", Request.ALL)) - .getByteData()); - return new ColorMapData(bb, - new int[] { so.getNx(), so.getNy() }, dataType); - } catch (Exception e) { - throw new VizException("Error requesting record data", e); - } - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + ((record == null) ? 0 : record.hashCode()); - result = prime * result + (signed ? 1231 : 1237); - return result; - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - SatelliteDataRetriever other = (SatelliteDataRetriever) obj; - if (record == null) { - if (other.record != null) - return false; - } else if (!record.equals(other.record)) - return false; - if (signed != other.signed) - return false; - return true; - } - - } - - private class SatTrueColorRenderable implements IRenderable { - - private SatelliteRecord baseRecord; - - private IMultiChannelImage image; - - private ImageTile tile; - - private Map recordMap = new HashMap(); - - public SatTrueColorRenderable(SatelliteRecord[] records) - throws VizException { - for (SatelliteRecord record : records) { - addRecord(record); - } - - image = multiExt - .constructImage(createImageMapping(this, - getCapability(MultiChannelCapability.class) - .getChannelMap())); - ImagingCapability ic = getCapability(ImagingCapability.class); - image.setBrightness(ic.getBrightness()); - image.setContrast(ic.getContrast()); - image.setInterpolated(ic.isInterpolationState()); - } - - public void addRecord(SatelliteRecord record) throws VizException { - if (tile == null) { - baseRecord = record; - tile = constructCoverage(record); - } - - Map mapping = RecordFactory.getInstance() - .loadMapFromUri(record.getDataURI()); - String key = String.valueOf(mapping.get(resourceData - .getUniqueField())); - - recordMap.put(key, new SatelliteDataRetriever(record, false)); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.drawables.IRenderable#paint(com.raytheon - * .uf.viz.core.IGraphicsTarget, - * com.raytheon.uf.viz.core.drawables.PaintProperties) - */ - @Override - public void paint(IGraphicsTarget target, PaintProperties paintProps) - throws VizException { - target.drawRasters(paintProps, new DrawableImage(image, - tile.coverage, RasterMode.ASYNCHRONOUS)); - } - - public void dispose() { - if (image != null) { - image.dispose(); - image = null; - } - if (tile != null) { - tile.dispose(); - tile = null; - } - - recordMap.clear(); - baseRecord = null; - } - - } - - private IMultiChannelImageExtension multiExt; - - private IMapMeshExtension meshExt; - - /** - * @param resourceData - * @param loadProperties - */ - protected SatTrueColorResource(SatTrueColorResourceData resourceData, - LoadProperties loadProperties, Collection records) { - super(resourceData, loadProperties); - String[] rgb = resourceData.getRedGreenBlue(); - MultiChannelCapability mcc = getCapability(MultiChannelCapability.class); - mcc.setNames(rgb); - Map channelMap = mcc.getChannelMap(); - // Process new entries - Channel[] channels = Channel.values(); - for (int i = 0; i < channels.length; ++i) { - Channel c = channels[i]; - ChannelData cd = channelMap.get(c); - if (cd == null) { - cd = new ChannelData(i < rgb.length ? rgb[i] : null, - newParams(), false); - channelMap.put(c, cd); - } else { - if (cd.name == null) { - cd.name = i < rgb.length ? rgb[i] : null; - } - if (cd.parameters == null) { - cd.parameters = newParams(); - } - } - cd.parameters.addListener(this); - } - getCapability(ImagingCapability.class); - resourceData.fireChangeListeners(ChangeType.DATA_UPDATE, - records.toArray(new SatelliteRecord[records.size()])); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.rsc.AbstractVizResource#initInternal(com.raytheon - * .uf.viz.core.IGraphicsTarget) - */ - @Override - protected void initInternal(IGraphicsTarget target) throws VizException { - // Grab extensions that will be used - multiExt = target.getExtension(IMultiChannelImageExtension.class); - meshExt = target.getExtension(IMapMeshExtension.class); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#getName() - */ - @Override - public String getName() { - Map channelMap = getCapability( - MultiChannelCapability.class).getChannelMap(); - String components = ""; - if (channelMap != null) { - int i = 0; - for (Channel c : Channel.values()) { - ChannelData cd = channelMap.get(c); - if (cd != null && cd.name != null) { - if (i > 0) { - components += ","; - } - components += c.name().charAt(0); - ++i; - } - } - } - return NAME + " (" + components + ")"; - } - - /** - * @param record - * @return - */ - private ImageTile constructCoverage(SatelliteRecord record) - throws VizException { - GridGeometry2D geom = MapUtil - .getGridGeometry(record.getSpatialObject()); - ImageTile tile = new ImageTile(); - tile.setGridGeometry(geom); - tile.coverage = new PixelCoverage(new Coordinate(), 0, 0); - tile.coverage.setMesh(meshExt.constructMesh(geom, descriptor)); - return tile; - } - - private Map createImageMapping( - SatTrueColorRenderable renderable, - Map channelMap) { - Map newMapping = new HashMap(); - for (Entry entry : channelMap.entrySet()) { - IColorMapDataRetrievalCallback callback = renderable.recordMap - .get(entry.getValue().name); - if (callback != null) { - try { - IImageChannel imageChannel = multiExt.constructImage( - callback, entry.getValue()); - newMapping.put(entry.getKey(), imageChannel); - } catch (VizException e) { - statusHandler.handle(Priority.PROBLEM, - e.getLocalizedMessage(), e); - } - } - } - return newMapping; - } - - private ColorMapParameters newParams() { - ColorMapParameters params = new ColorMapParameters(); - params.setDataMin(0); - params.setDataMax(255); - params.setColorMapMin(0); - params.setColorMapMax(255); - return params; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.rsc.AbstractPluginDataObjectResource# - * capabilityChanged(com.raytheon.uf.viz.core.drawables.IRenderable, - * com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability) - */ - @Override - protected void capabilityChanged(IRenderable renderable, - AbstractCapability capability) { - SatTrueColorRenderable stcr = (SatTrueColorRenderable) renderable; - if (stcr.image != null) { - if (capability instanceof ImagingCapability) { - ImagingCapability ic = (ImagingCapability) capability; - stcr.image.setBrightness(ic.getBrightness()); - stcr.image.setContrast(ic.getContrast()); - stcr.image.setInterpolated(ic.isInterpolationState()); - } else if (capability instanceof MultiChannelCapability) { - MultiChannelCapability mcc = (MultiChannelCapability) capability; - final Map currMapping = stcr.image - .getImageMapping(); - stcr.image.setImageMapping(createImageMapping(stcr, - mcc.getChannelMap())); - // Dispose old mapping - VizApp.runAsync(new Runnable() { - @Override - public void run() { - for (IColormappedImage img : currMapping.values()) { - if (img != null) { - img.dispose(); - } - } - } - }); - } - issueRefresh(); - } - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.rsc.AbstractPluginDataObjectResource# - * disposeRenderable(com.raytheon.uf.viz.core.drawables.IRenderable) - */ - @Override - protected void disposeRenderable(IRenderable renderable) { - ((SatTrueColorRenderable) renderable).dispose(); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.rsc.AbstractPluginDataObjectResource# - * projectRenderable(com.raytheon.uf.viz.core.drawables.IRenderable, - * org.opengis.referencing.crs.CoordinateReferenceSystem) - */ - @Override - protected boolean projectRenderable(IRenderable renderable, - CoordinateReferenceSystem crs) throws VizException { - SatTrueColorRenderable stcr = (SatTrueColorRenderable) renderable; - ImageTile newTile = constructCoverage(stcr.baseRecord); - ImageTile oldTile = stcr.tile; - stcr.tile = newTile; - if (oldTile != null) { - oldTile.dispose(); - } - return true; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.rsc.AbstractPluginDataObjectResource# - * constructRenderable(java.util.List) - */ - @Override - protected IRenderable constructRenderable(List records) - throws VizException { - SatelliteRecord[] satRecords = new SatelliteRecord[records.size()]; - for (int i = 0; i < satRecords.length; ++i) { - satRecords[i] = (SatelliteRecord) records.get(i); - } - return new SatTrueColorRenderable(satRecords); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.rsc.AbstractPluginDataObjectResource# - * updateRenderable(com.raytheon.uf.viz.core.drawables.IRenderable, - * com.raytheon.uf.common.dataplugin.PluginDataObject) - */ - @Override - protected boolean updateRenderable(IRenderable renderable, - PluginDataObject pdo) { - try { - SatTrueColorRenderable stcr = (SatTrueColorRenderable) renderable; - stcr.addRecord((SatelliteRecord) pdo); - capabilityChanged(stcr, getCapability(MultiChannelCapability.class)); - return true; - } catch (VizException e) { - statusHandler.handle(Priority.PROBLEM, - "Error updating satellite renderable with new data", e); - } - return false; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.drawables.IColorMapParametersListener# - * colorMapChanged() - */ - @Override - public void colorMapChanged() { - issueRefresh(); - } -} diff --git a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatTrueColorResourceData.java b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatTrueColorResourceData.java deleted file mode 100644 index 2777a9b8c3..0000000000 --- a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatTrueColorResourceData.java +++ /dev/null @@ -1,134 +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.satellite.rsc; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; - -import com.raytheon.uf.common.dataplugin.PluginDataObject; -import com.raytheon.uf.common.dataplugin.satellite.SatelliteRecord; -import com.raytheon.uf.common.dataquery.requests.RequestConstraint; -import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData; -import com.raytheon.uf.viz.core.rsc.AbstractVizResource; -import com.raytheon.uf.viz.core.rsc.LoadProperties; - -/** - * Satellite true color resource data. The field used to differentiate - * red/green/blue bands should not be added to the resource data's metadata map. - * The resource data itself will do that by adding an IN entry for the unique - * field for each item in redGreenBlue object - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Dec 20, 2011            mschenke     Initial creation
- * 
- * 
- * - * @author mschenke - * @version 1.0 - */ -@XmlAccessorType(XmlAccessType.NONE) -public class SatTrueColorResourceData extends AbstractRequestableResourceData { - - @XmlElement - private String uniqueField; - - @XmlElement - private String[] redGreenBlue; - - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData# - * constructResource(com.raytheon.uf.viz.core.rsc.LoadProperties, - * com.raytheon.uf.common.dataplugin.PluginDataObject[]) - */ - @Override - protected AbstractVizResource constructResource( - LoadProperties loadProperties, PluginDataObject[] objects) - throws VizException { - List records = new ArrayList( - objects.length); - for (PluginDataObject pdo : objects) { - records.add((SatelliteRecord) pdo); - } - return new SatTrueColorResource(this, loadProperties, records); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData#getMetadataMap - * () - */ - @Override - public HashMap getMetadataMap() { - HashMap mdm = new HashMap( - super.getMetadataMap()); - RequestConstraint constraint = new RequestConstraint("", - ConstraintType.IN); - constraint.setConstraintValueList(redGreenBlue); - mdm.put(uniqueField, constraint); - return mdm; - } - - /** - * @return the uniqueField - */ - public String getUniqueField() { - return uniqueField; - } - - /** - * @param uniqueField - * the uniqueField to set - */ - public void setUniqueField(String uniqueField) { - this.uniqueField = uniqueField; - } - - /** - * @return the redGreenBlue - */ - public String[] getRedGreenBlue() { - return redGreenBlue; - } - - /** - * @param redGreenBlue - * the redGreenBlue to set - */ - public void setRedGreenBlue(String[] redGreenBlue) { - this.redGreenBlue = redGreenBlue; - } - -} diff --git a/cave/com.raytheon.viz.ui/plugin.xml b/cave/com.raytheon.viz.ui/plugin.xml index 093399b231..0c7a1498c5 100644 --- a/cave/com.raytheon.viz.ui/plugin.xml +++ b/cave/com.raytheon.viz.ui/plugin.xml @@ -64,11 +64,6 @@ name="ColorEditDialog" sortID="20"> -