2 Copyright (C) 2001, 2006 United States Government
3 as represented by the Administrator of the
4 National Aeronautics and Space Administration.
7 package gov
.nasa
.worldwind
;
9 import gov
.nasa
.worldwind
.geom
.*;
11 import com
.sun
.opengl
.util
.*;
13 import javax
.media
.opengl
.*;
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())
49 int colorCode
= this.getTopColor(dc
, pickPoint
);
50 if (colorCode
== dc
.getClearColor().getRGB())
53 PickedObject pickedObject
= pickableObjects
.get(colorCode
);
54 if (pickedObject
== null)
58 pickedObject
.setParentLayer(layer
);
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
);
72 public int getTopColor(DrawContext dc
, java
.awt
.Point pickPoint
)
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;
86 topColor
= new java
.awt
.Color(pixel
.get(0) & 0xff, pixel
.get(1) & 0xff, pixel
.get(2) & 0xff, 0);
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();