Worldwind public release 0.2
[worldwind-tracker.git] / gov / nasa / worldwind / PickSupport.java
blob7fde5e5d44c04c02edb570a0b68e45e2f28f7cb4
1 /*
2 Copyright (C) 2001, 2006 United States Government
3 as represented by the Administrator of the
4 National Aeronautics and Space Administration.
5 All Rights Reserved.
6 */
7 package gov.nasa.worldwind;
9 import gov.nasa.worldwind.geom.*;
11 import com.sun.opengl.util.*;
13 import javax.media.opengl.*;
14 import java.util.*;
16 /**
17 * @author tag
18 * @version $Id: PickSupport.java 1754 2007-05-06 23:19:22Z tgaskins $
20 public class PickSupport
22 private HashMap<Integer, PickedObject> pickableObjects = new HashMap<Integer, PickedObject>();
24 public void clearPickList()
26 this.pickableObjects.clear();
29 public void addPickableObject(int colorCode, Object o, Position position, boolean isTerrain)
31 this.pickableObjects.put(colorCode, new PickedObject(colorCode, o, position, isTerrain));
34 public void addPickableObject(int colorCode, Object o)
36 this.pickableObjects.put(colorCode, new PickedObject(colorCode, o));
39 public void addPickableObject(int colorCode, PickedObject po)
41 this.pickableObjects.put(colorCode, po);
44 public PickedObject getTopObject(DrawContext dc, java.awt.Point pickPoint, Layer layer)
46 if (this.pickableObjects.isEmpty())
47 return null;
49 int colorCode = this.getTopColor(dc, pickPoint);
50 if (colorCode == dc.getClearColor().getRGB())
51 return null;
53 PickedObject pickedObject = pickableObjects.get(colorCode);
54 if (pickedObject == null)
55 return null;
57 if (layer != null)
58 pickedObject.setParentLayer(layer);
60 return pickedObject;
63 public void resolvePick(DrawContext dc, java.awt.Point pickPoint, Layer layer)
65 PickedObject pickedObject = this.getTopObject(dc, pickPoint, layer);
66 if (pickedObject != null)
67 dc.addPickedObject(pickedObject);
69 this.clearPickList();
72 public int getTopColor(DrawContext dc, java.awt.Point pickPoint)
74 GL gl = dc.getGL();
76 int[] viewport = new int[4];
77 gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0);
79 java.nio.ByteBuffer pixel = BufferUtil.newByteBuffer(3);
80 gl.glReadPixels(pickPoint.x, viewport[3] - pickPoint.y, 1, 1,
81 javax.media.opengl.GL.GL_RGB, GL.GL_UNSIGNED_BYTE, pixel);
83 java.awt.Color topColor = null;
84 try
86 topColor = new java.awt.Color(pixel.get(0) & 0xff, pixel.get(1) & 0xff, pixel.get(2) & 0xff, 0);
88 catch (Exception e)
90 String message = WorldWind.retrieveErrMsg("layers.InvalidPickColorRead");
91 WorldWind.logger().log(java.util.logging.Level.FINE, message);
94 return topColor != null ? topColor.getRGB() : 0;
97 public void beginPicking(DrawContext dc)
99 javax.media.opengl.GL gl = dc.getGL();
101 gl.glPushAttrib(GL.GL_ENABLE_BIT);
103 gl.glDisable(GL.GL_DITHER);
104 gl.glDisable(GL.GL_LIGHTING);
105 gl.glDisable(GL.GL_FOG);
106 gl.glDisable(GL.GL_BLEND);
107 gl.glDisable(GL.GL_TEXTURE_2D);
110 public void endPicking(DrawContext dc)
112 dc.getGL().glPopAttrib();