⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 markerrenderer.java

📁 world wind java sdk 源码
💻 JAVA
字号:
/*Copyright (C) 2001, 2008 United States Governmentas represented by the Administrator of theNational Aeronautics and Space Administration.All Rights Reserved.*/package gov.nasa.worldwind.render.markers;import gov.nasa.worldwind.avlist.*;import gov.nasa.worldwind.geom.*;import gov.nasa.worldwind.layers.*;import gov.nasa.worldwind.pick.*;import gov.nasa.worldwind.render.*;import gov.nasa.worldwind.util.*;import javax.media.opengl.*;import java.util.*;/** * @author tag * @version $Id: MarkerRenderer.java 8817 2009-02-11 09:04:46Z tgaskins $ */public class MarkerRenderer{    private double elevation = 10d;    private boolean overrideMarkerElevation = false;    private boolean keepSeparated = true;    private boolean enablePickSizeReturn = false;    protected PickSupport pickSupport = new PickSupport();    public double getElevation()    {        return elevation;    }    public void setElevation(double elevation)    {        this.elevation = elevation;    }    public boolean isOverrideMarkerElevation()    {        return overrideMarkerElevation;    }    public void setOverrideMarkerElevation(boolean overrideMarkerElevation)    {        this.overrideMarkerElevation = overrideMarkerElevation;    }    public boolean isKeepSeparated()    {        return keepSeparated;    }    public void setKeepSeparated(boolean keepSeparated)    {        this.keepSeparated = keepSeparated;    }    public boolean isEnablePickSizeReturn()    {        return enablePickSizeReturn;    }    public void setEnablePickSizeReturn(boolean enablePickSizeReturn)    {        this.enablePickSizeReturn = enablePickSizeReturn;    }    public void render(DrawContext dc, Iterable<Marker> markers)    {        if (dc == null)        {            String message = Logging.getMessage("nullValue.DrawContextIsNull");            Logging.logger().severe(message);            throw new IllegalStateException(message);        }        if (markers == null)        {            String message = Logging.getMessage("nullValue.MarkerListIsNull");            Logging.logger().severe(message);            throw new IllegalStateException(message);        }        this.draw(dc, markers);    }    public void pick(DrawContext dc, Iterable<Marker> markers, java.awt.Point pickPoint, Layer layer)    {        if (dc == null)        {            String message = Logging.getMessage("nullValue.DrawContextIsNull");            Logging.logger().severe(message);            throw new IllegalStateException(message);        }        if (pickPoint == null)        {            String message = Logging.getMessage("nullValue.PickPoint");            Logging.logger().severe(message);            throw new IllegalStateException(message);        }        this.pickSupport.clearPickList();        this.draw(dc, markers);        this.pickSupport.resolvePick(dc, pickPoint, layer);        this.pickSupport.clearPickList(); // to ensure entries can be garbage collected    }    protected void draw(DrawContext dc, Iterable<Marker> markers)    {        if (this.isKeepSeparated())            this.drawSeparated(dc, markers);        else            this.drawAll(dc, markers);    }    private MarkerAttributes previousAttributes; // used only by drawSeparated and drawMarker    protected void drawSeparated(DrawContext dc, Iterable<Marker> markers)    {        this.begin(dc);        {            try            {                List<Marker> markerList;                if (markers instanceof List)                {                    markerList = (List<Marker>) markers;                }                else                {                    markerList = new ArrayList<Marker>();                    for (Marker m : markers)                    {                        markerList.add(m);                    }                }                if (markerList.size() == 0)                    return;                this.previousAttributes = null;                Marker m1 = markerList.get(0);                Vec4 p1 = this.computeSurfacePoint(dc, m1.getPosition());                double r1 = this.computeMarkerRadius(dc, p1, m1);                this.drawMarker(dc, 0, m1, p1, r1);                if (markerList.size() < 2)                    return;                Marker m2 = markerList.get(markerList.size() - 1);                Vec4 p2 = this.computeSurfacePoint(dc, m2.getPosition());                double r2 = this.computeMarkerRadius(dc, p2, m2);                this.drawMarker(dc, markerList.size() - 1, m2, p2, r2);                if (markerList.size() < 3)                    return;                this.drawInBetweenMarkers(dc, 0, p1, r1, markerList.size() - 1, p2, r2, markerList);            }            finally            {                this.end(dc);            }        }    }    private void drawInBetweenMarkers(DrawContext dc, int im1, Vec4 p1, double r1, int im2, Vec4 p2, double r2,        List<Marker> markerList)    {        if (im2 == im1 + 1)            return;        if (p1.distanceTo3(p2) <= r1 + r2)            return;        int im = (im1 + im2) / 2;        Marker m = markerList.get(im);        Vec4 p = this.computeSurfacePoint(dc, m.getPosition());        double r = this.computeMarkerRadius(dc, p, m);        boolean b1 = false, b2 = false;        if (p.distanceTo3(p1) > r + r1)        {            this.drawInBetweenMarkers(dc, im1, p1, r1, im, p, r, markerList);            b1 = true;        }        if (p.distanceTo3(p2) > r + r2)        {            this.drawInBetweenMarkers(dc, im, p, r, im2, p2, r2, markerList);            b2 = true;        }        if (b1 && b2)            this.drawMarker(dc, im, m, p, r);    }    private void drawMarker(DrawContext dc, int index, Marker marker, Vec4 point, double radius)    {        if (!dc.getView().getFrustumInModelCoordinates().contains(point))            return;        if (dc.isPickingMode())        {            java.awt.Color color = dc.getUniquePickColor();            int colorCode = color.getRGB();            PickedObject po = new PickedObject(colorCode, marker, marker.getPosition(), false);            po.setValue(AVKey.PICKED_OBJECT_ID, index);            if (this.enablePickSizeReturn)                po.setValue(AVKey.PICKED_OBJECT_SIZE, 2 * radius);            this.pickSupport.addPickableObject(po);            dc.getGL().glColor3ub((byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue());        }        MarkerAttributes attrs = marker.getAttributes();        if (attrs != this.previousAttributes) // equality is intentional to avoid constant equals() calls        {            attrs.apply(dc);            this.previousAttributes = attrs;        }        marker.render(dc, point, radius);    }    protected void drawAll(DrawContext dc, Iterable<Marker> markers)    {        this.begin(dc);        {            try            {                MarkerAttributes previousAttrs = null;                Iterator<Marker> markerIterator = markers.iterator();                for (int index = 0; markerIterator.hasNext(); index++)                {                    Marker marker = markerIterator.next();                    if (marker == null)                        continue;                    MarkerAttributes attrs = marker.getAttributes();                    if (attrs != previousAttrs) // equality test is intentional to avoid constant equals() calls                    {                        attrs.apply(dc);                        previousAttrs = attrs;                    }                    Position pos = marker.getPosition();                    Vec4 point = this.computeSurfacePoint(dc, pos);                    if (!dc.getView().getFrustumInModelCoordinates().contains(point))                        continue;                    double radius = this.computeMarkerRadius(dc, point, marker);                    if (dc.isPickingMode())                    {                        java.awt.Color color = dc.getUniquePickColor();                        int colorCode = color.getRGB();                        PickedObject po = new PickedObject(colorCode, marker, pos, false);                        po.setValue(AVKey.PICKED_OBJECT_ID, index);                        if (this.enablePickSizeReturn)                            po.setValue(AVKey.PICKED_OBJECT_SIZE, 2 * radius);                        this.pickSupport.addPickableObject(po);                        dc.getGL().glColor3ub((byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue());                    }                    marker.render(dc, point, radius);                }            }            finally            {                this.end(dc);            }        }    }    protected void begin(DrawContext dc)    {        GL gl = dc.getGL();        Vec4 cameraPosition = dc.getView().getEyePoint();        if (dc.isPickingMode())        {            this.pickSupport.beginPicking(dc);            gl.glPushAttrib(GL.GL_ENABLE_BIT | GL.GL_CURRENT_BIT | GL.GL_TRANSFORM_BIT);            gl.glDisable(GL.GL_TEXTURE_2D);            gl.glDisable(GL.GL_COLOR_MATERIAL);        }        else        {            gl.glPushAttrib(                GL.GL_TEXTURE_BIT | GL.GL_ENABLE_BIT | GL.GL_CURRENT_BIT | GL.GL_LIGHTING_BIT | GL.GL_TRANSFORM_BIT                    | GL.GL_COLOR_BUFFER_BIT);            gl.glDisable(GL.GL_TEXTURE_2D);            float[] lightPosition =                {(float) (cameraPosition.x * 2), (float) (cameraPosition.y / 2), (float) (cameraPosition.z), 0.0f};            float[] lightDiffuse = {1.0f, 1.0f, 1.0f, 1.0f};            float[] lightAmbient = {1.0f, 1.0f, 1.0f, 1.0f};            float[] lightSpecular = {1.0f, 1.0f, 1.0f, 1.0f};            gl.glDisable(GL.GL_COLOR_MATERIAL);            gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, lightPosition, 0);            gl.glLightfv(GL.GL_LIGHT1, GL.GL_DIFFUSE, lightDiffuse, 0);            gl.glLightfv(GL.GL_LIGHT1, GL.GL_AMBIENT, lightAmbient, 0);            gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPECULAR, lightSpecular, 0);            gl.glDisable(GL.GL_LIGHT0);            gl.glEnable(GL.GL_LIGHT1);            gl.glEnable(GL.GL_LIGHTING);            gl.glEnable(GL.GL_NORMALIZE);            // Set up for opacity, either explictly via attributes or implicitly as alpha in the marker color            dc.getGL().glEnable(GL.GL_BLEND);            dc.getGL().glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);        }        gl.glMatrixMode(GL.GL_MODELVIEW);        gl.glPushMatrix();    }    protected void end(DrawContext dc)    {        GL gl = dc.getGL();        gl.glMatrixMode(GL.GL_MODELVIEW);        gl.glPopMatrix();        if (dc.isPickingMode())        {            this.pickSupport.endPicking(dc);        }        else        {            gl.glDisable(GL.GL_LIGHT1);            gl.glEnable(GL.GL_LIGHT0);            gl.glDisable(GL.GL_LIGHTING);            gl.glDisable(GL.GL_NORMALIZE);        }        gl.glPopAttrib();    }    protected Vec4 computeSurfacePoint(DrawContext dc, Position pos)    {        if (!this.overrideMarkerElevation)            return dc.getGlobe().computePointFromPosition(pos);        // Compute points that are at the renderer-specified elevation        Vec4 point = dc.getSurfaceGeometry().getSurfacePoint(pos.getLatitude(), pos.getLongitude(), this.elevation);        if (point != null)            return point;        // Point is outside the current sector geometry, so compute it from the globe.        return dc.getGlobe().computePointFromPosition(pos.getLatitude(), pos.getLongitude(), this.elevation);    }    protected double computeMarkerRadius(DrawContext dc, Vec4 point, Marker marker)    {        double d = point.distanceTo3(dc.getView().getEyePoint());        double radius = marker.getAttributes().getMarkerPixels() * dc.getView().computePixelSizeAtDistance(d);        if (radius < marker.getAttributes().getMinMarkerSize())            radius = marker.getAttributes().getMinMarkerSize();        else if (radius > marker.getAttributes().getMaxMarkerSize())            radius = marker.getAttributes().getMaxMarkerSize();        return radius;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -