/* Copyright (C) 2001, 2006 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved. */ package gov.nasa.worldwind.pick; import com.sun.opengl.util.BufferUtil; import gov.nasa.worldwind.geom.Position; import gov.nasa.worldwind.layers.Layer; import gov.nasa.worldwind.render.DrawContext; import gov.nasa.worldwind.util.Logging; import javax.media.opengl.GL; import java.util.HashMap; /** * @author tag * @version $Id: PickSupport.java 4512 2008-02-16 05:48:49Z tgaskins $ */ public class PickSupport { private HashMap<Integer, PickedObject> pickableObjects = new HashMap<Integer, PickedObject>(); public void clearPickList() { this.pickableObjects.clear(); } public void addPickableObject(int colorCode, Object o, Position position, boolean isTerrain) { this.pickableObjects.put(colorCode, new PickedObject(colorCode, o, position, isTerrain)); } public void addPickableObject(int colorCode, Object o) { this.pickableObjects.put(colorCode, new PickedObject(colorCode, o)); } public void addPickableObject(PickedObject po) { this.pickableObjects.put(po.getColorCode(), po); } public PickedObject getTopObject(DrawContext dc, java.awt.Point pickPoint, Layer layer) { if (this.pickableObjects.isEmpty()) return null; int colorCode = this.getTopColor(dc, pickPoint); if (colorCode == dc.getClearColor().getRGB()) return null; PickedObject pickedObject = pickableObjects.get(colorCode); if (pickedObject == null) return null; if (layer != null) pickedObject.setParentLayer(layer); return pickedObject; } public void resolvePick(DrawContext dc, java.awt.Point pickPoint, Layer layer) { PickedObject pickedObject = this.getTopObject(dc, pickPoint, layer); if (pickedObject != null) dc.addPickedObject(pickedObject); this.clearPickList(); } public int getTopColor(DrawContext dc, java.awt.Point pickPoint) { GL gl = dc.getGL(); int[] viewport = new int[4]; gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0); java.nio.ByteBuffer pixel = BufferUtil.newByteBuffer(3); gl.glReadPixels(pickPoint.x, viewport[3] - pickPoint.y, 1, 1, javax.media.opengl.GL.GL_RGB, GL.GL_UNSIGNED_BYTE, pixel); java.awt.Color topColor = null; try { topColor = new java.awt.Color(pixel.get(0) & 0xff, pixel.get(1) & 0xff, pixel.get(2) & 0xff, 0); } catch (Exception e) { Logging.logger().severe("layers.InvalidPickColorRead"); } return topColor != null ? topColor.getRGB() : 0; } public void beginPicking(DrawContext dc) { javax.media.opengl.GL gl = dc.getGL(); gl.glPushAttrib(GL.GL_ENABLE_BIT); gl.glDisable(GL.GL_DITHER); gl.glDisable(GL.GL_LIGHTING); gl.glDisable(GL.GL_FOG); gl.glDisable(GL.GL_BLEND); gl.glDisable(GL.GL_TEXTURE_2D); } public void endPicking(DrawContext dc) { dc.getGL().glPopAttrib(); } }