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

📄 ebsrectangulartessellator.java

📁 world wind java sdk 源码
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
            String msg = Logging.getMessage("nullValue.RenderInfoIsNull");            Logging.logger().severe(msg);            throw new IllegalStateException(msg);        }        java.nio.IntBuffer indices = getIndices(tile.ri.density,tile.ri.numVerticesDroppedPerRow);        indices.rewind();        dc.getView().pushReferenceCenter(dc, tile.ri.referenceCenter);        javax.media.opengl.GL gl = dc.getGL();        gl.glPushAttrib(            GL.GL_DEPTH_BUFFER_BIT | GL.GL_POLYGON_BIT | GL.GL_TEXTURE_BIT | GL.GL_ENABLE_BIT | GL.GL_CURRENT_BIT);        gl.glEnable(GL.GL_BLEND);        gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE);        gl.glDisable(javax.media.opengl.GL.GL_DEPTH_TEST);        gl.glEnable(javax.media.opengl.GL.GL_CULL_FACE);        gl.glCullFace(javax.media.opengl.GL.GL_BACK);        gl.glDisable(javax.media.opengl.GL.GL_TEXTURE_2D);        gl.glColor4d(1d, 1d, 1d, 0.2);        gl.glPolygonMode(javax.media.opengl.GL.GL_FRONT, javax.media.opengl.GL.GL_LINE);        if (showTriangles)        {            gl.glPushClientAttrib(GL.GL_CLIENT_VERTEX_ARRAY_BIT);            gl.glEnableClientState(GL.GL_VERTEX_ARRAY);            gl.glVertexPointer(3, GL.GL_DOUBLE, 0, tile.ri.vertices.rewind());            gl.glDrawElements(javax.media.opengl.GL.GL_TRIANGLE_STRIP, indices.limit(),                javax.media.opengl.GL.GL_UNSIGNED_INT, indices.rewind());            gl.glPopClientAttrib();        }        dc.getView().popReferenceCenter(dc);        if (showTileBoundary)            this.renderPatchBoundary(dc, tile, gl);        gl.glPopAttrib();    }    private void renderPatchBoundary(DrawContext dc, RectTile tile, GL gl)    {        // TODO: Currently only works if called from renderWireframe because no state is set here.        // TODO: Draw the boundary using the vertices along the boundary rather than just at the corners.        gl.glColor4d(1d, 0, 0, 1d);        Vec4[] corners = tile.sector.computeCornerPoints(dc.getGlobe(), dc.getVerticalExaggeration());        gl.glBegin(javax.media.opengl.GL.GL_QUADS);        gl.glVertex3d(corners[0].x, corners[0].y, corners[0].z);        gl.glVertex3d(corners[1].x, corners[1].y, corners[1].z);        gl.glVertex3d(corners[2].x, corners[2].y, corners[2].z);        gl.glVertex3d(corners[3].x, corners[3].y, corners[3].z);        gl.glEnd();    }    private void renderBoundingVolume(DrawContext dc, RectTile tile)    {        Extent extent = tile.getExtent();        if (extent == null)            return;        if (extent instanceof Cylinder)            ((Cylinder) extent).render(dc);    }    private PickedObject[] pick(DrawContext dc, RectTile tile, List<? extends Point> pickPoints)    {        if (dc == null)        {            String msg = Logging.getMessage("nullValue.DrawContextIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        if (pickPoints.size() == 0)            return null;        if (tile.ri == null)            return null;        PickedObject[] pos = new PickedObject[pickPoints.size()];        this.renderTrianglesWithUniqueColors(dc, tile);        for (int i = 0; i < pickPoints.size(); i++)        {            pos[i] = this.resolvePick(dc, tile, pickPoints.get(i));        }        return pos;    }    private void pick(DrawContext dc, RectTile tile, Point pickPoint)    {        if (dc == null)        {            String msg = Logging.getMessage("nullValue.DrawContextIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        if (tile.ri == null)            return;        renderTrianglesWithUniqueColors(dc, tile);        PickedObject po = this.resolvePick(dc, tile, pickPoint);        if (po != null)            dc.addPickedObject(po);    }    private void renderTrianglesWithUniqueColors(DrawContext dc, RectTile tile)    {        if (dc == null)        {            String message = Logging.getMessage("nullValue.DrawContextIsNull");            Logging.logger().severe(message);            throw new IllegalStateException(message);        }        if (tile.ri.vertices == null)            return;        tile.ri.vertices.rewind();        tile.ri.indices.rewind();        javax.media.opengl.GL gl = dc.getGL();        if (null != tile.ri.referenceCenter)            dc.getView().pushReferenceCenter(dc, tile.ri.referenceCenter);        tile.minColorCode = dc.getUniquePickColor().getRGB();        int trianglesNum = tile.ri.indices.capacity() - 2;        int[] indices = new int[3];        double[] coords = new double[3];        gl.glBegin(GL.GL_TRIANGLES);        for (int i = 0; i < trianglesNum; i++)        {            java.awt.Color color = dc.getUniquePickColor();            gl.glColor3ub((byte) (color.getRed() & 0xFF),                (byte) (color.getGreen() & 0xFF),                (byte) (color.getBlue() & 0xFF));            tile.ri.indices.position(i);            tile.ri.indices.get(indices);            tile.ri.vertices.position(3 * indices[0]);            tile.ri.vertices.get(coords);            gl.glVertex3d(coords[0], coords[1], coords[2]);//            int vIndex = 3 * tile.ri.indices.get(i);//            gl.glVertex3d(tile.ri.vertices.get(vIndex), tile.ri.vertices.get(vIndex + 1), tile.ri.vertices.get(//                vIndex + 2));            tile.ri.vertices.position(3 * indices[1]);            tile.ri.vertices.get(coords);            gl.glVertex3d(coords[0], coords[1], coords[2]);//            vIndex = 3 * tile.ri.indices.get(i + 1);//            gl.glVertex3d(tile.ri.vertices.get(vIndex), tile.ri.vertices.get(vIndex + 1), tile.ri.vertices.get(//                vIndex + 2));            tile.ri.vertices.position(3 * indices[2]);            tile.ri.vertices.get(coords);            gl.glVertex3d(coords[0], coords[1], coords[2]);//            vIndex = 3 * indices[2];//tile.ri.indices.get(i + 2);//            gl.glVertex3d(tile.ri.vertices.get(vIndex), tile.ri.vertices.get(vIndex + 1), tile.ri.vertices.get(//                vIndex + 2));        }        gl.glEnd();        tile.maxColorCode = dc.getUniquePickColor().getRGB();        if (null != tile.ri.referenceCenter)            dc.getView().popReferenceCenter(dc);    }    private PickedObject resolvePick(DrawContext dc, RectTile tile, Point pickPoint)    {        int colorCode = this.pickSupport.getTopColor(dc, pickPoint);        if (colorCode < tile.minColorCode || colorCode > tile.maxColorCode)            return null;        double EPSILON = (double) 0.00001f;        int triangleIndex = colorCode - tile.minColorCode - 1;        if (tile.ri.indices == null || triangleIndex >= (tile.ri.indices.capacity() - 2))            return null;        double centerX = tile.ri.referenceCenter.x;        double centerY = tile.ri.referenceCenter.y;        double centerZ = tile.ri.referenceCenter.z;        int[] indices = new int[3];        tile.ri.indices.position(triangleIndex);        tile.ri.indices.get(indices);//        int vIndex = 3 * tile.ri.indices.get(triangleIndex);        double[] coords = new double[3];        tile.ri.vertices.position(3 * indices[0]);        tile.ri.vertices.get(coords);        Vec4 v0 = new Vec4(coords[0] + centerX, coords[1] + centerY, coords[2] + centerZ);//        Vec4 v0 = new Vec4((tile.ri.vertices.get(vIndex++) + centerX),//            (tile.ri.vertices.get(vIndex++) + centerY),//            (tile.ri.vertices.get(vIndex) + centerZ));//        vIndex = 3 * tile.ri.indices.get(triangleIndex + 1);        tile.ri.vertices.position(3 * indices[1]);        tile.ri.vertices.get(coords);        Vec4 v1 = new Vec4(coords[0] + centerX, coords[1] + centerY, coords[2] + centerZ);//        Vec4 v1 = new Vec4((tile.ri.vertices.get(vIndex++) + centerX),//            (tile.ri.vertices.get(vIndex++) + centerY),//            (tile.ri.vertices.get(vIndex) + centerZ));//        vIndex = 3 * tile.ri.indices.get(triangleIndex + 2);        tile.ri.vertices.position(3 * indices[2]);        tile.ri.vertices.get(coords);        Vec4 v2 = new Vec4(coords[0] + centerX, coords[1] + centerY, coords[2] + centerZ);//        Vec4 v2 = new Vec4((tile.ri.vertices.get(vIndex++) + centerX),//            (tile.ri.vertices.get(vIndex++) + centerY),//            (tile.ri.vertices.get(vIndex) + centerZ));        // get triangle edge vectors and plane normal        Vec4 e1 = v1.subtract3(v0);        Vec4 e2 = v2.subtract3(v0);        Vec4 N = e1.cross3(e2);  // if N is 0, the triangle is degenerate, we are not dealing with it        Line ray = dc.getView().computeRayFromScreenPoint(pickPoint.getX(), pickPoint.getY());        Vec4 w0 = ray.getOrigin().subtract3(v0);        double a = -N.dot3(w0);        double b = N.dot3(ray.getDirection());        if (java.lang.Math.abs(b) < EPSILON) // ray is parallel to triangle plane            return null;                    // if a == 0 , ray lies in triangle plane        double r = a / b;        Vec4 intersect = ray.getOrigin().add3(ray.getDirection().multiply3(r));        Position pp = dc.getGlobe().computePositionFromPoint(intersect);        // Draw the elevation from the elevation model, not the geode.        double elev = dc.getGlobe().getElevation(pp.getLatitude(), pp.getLongitude());        elev *= dc.getVerticalExaggeration();        Position p = new Position(pp.getLatitude(), pp.getLongitude(), elev);        return new PickedObject(pickPoint, colorCode, p, pp.getLatitude(), pp.getLongitude(), elev, true);    }    /**     * Determines if and where a ray intersects a <code>RectTile</code> geometry.     *     * @param tile the <Code>RectTile</code> which geometry is to be tested for intersection.     * @param line the ray for which an intersection is to be found.     * @return the <Vec4> point closest to the ray origin where an intersection has been found     * or null if no intersection was found.     */    private Intersection[] intersect(RectTile tile, Line line)    {        if (line == null)        {            String msg = Logging.getMessage("nullValue.LineIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        if (tile.ri.vertices == null)            return null;        // Compute 'vertical' plane perpendicular to the ground, that contains the ray        Vec4 normalV = line.getDirection().cross3(globe.computeSurfaceNormalAtPoint(line.getOrigin()));        Plane verticalPlane = new Plane(normalV.x(),  normalV.y(),  normalV.z(),  -line.getOrigin().dot3(normalV));        if (!tile.getExtent().intersects(verticalPlane))            return null;        // Compute 'horizontal' plane perpendicular to the vertical plane, that contains the ray        Vec4 normalH = line.getDirection().cross3(normalV);        Plane horizontalPlane = new Plane(normalH.x(),  normalH.y(),  normalH.z(),  -line.getOrigin().dot3(normalH));        if (!tile.getExtent().intersects(horizontalPlane))            return null;        Intersection[] hits;        ArrayList<Intersection> list = new ArrayList<Intersection>();        int[] indices = new int[tile.ri.indices.limit()];        double[] coords = new double[tile.ri.vertices.limit()];        tile.ri.indices.rewind();        tile.ri.vertices.rewind();        tile.ri.indices.get(indices, 0, indices.length);        tile.ri.vertices.get(coords, 0, coords.length);        tile.ri.indices.rewind();        tile.ri.vertices.rewind();        int trianglesNum = tile.ri.indices.capacity() - 2;        double centerX = tile.ri.referenceCenter.x;        double centerY = tile.ri.referenceCenter.y;        double centerZ = tile.ri.referenceCenter.z;        // Compute maximum cell size based on tile delta lat, density and globe radius        double cellSide = tile.getSector().getDeltaLatRadians() * globe.getRadius() / density;        double maxCellRadius = Math.sqrt(cellSide * cellSide * 2) / 2;   // half cell diagonal        // Compute maximum elevation difference - assume cylinder as Extent        double elevationSpan = ((Cylinder)tile.getExtent()).getCylinderHeight();        // TODO: ignore back facing triangles?        // Loop through all tile cells - triangle pairs        int startIndice = (density + 2) * 2 + 6; // skip firts skirt row and a couple degenerate cells        int endIndice = trianglesNum - startIndice; // ignore last skirt row and a couple degenerate cells        int k = -1;        for (int i = startIndice; i < endIndice; i += 2)        {            // Skip skirts and degenerate triangle cells - based on indice sequence.            k = k == density - 1 ? -4 : k + 1; // density x terrain cells interleaved with 4 skirt and degenerate cells.            if (k < 0)                continue;            // Triangle pair diagonal - v1 & v2            int vIndex = 3 * indices[i + 1];            Vec4 v1 = new Vec4(                    coords[vIndex++] + centerX,                    coords[vIndex++] + centerY,                    coords[vIndex] + centerZ);            vIndex = 3 * indices[i + 2];            Vec4 v2 = new Vec4(

⌨️ 快捷键说明

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