orbit.java

来自「world wind java sdk 源码」· Java 代码 · 共 827 行 · 第 1/3 页

JAVA
827
字号
        this.getRenderer().drawGeometry(dc, indexGeom, vertexGeom);    }    private void drawLongCylinderOutline(DrawContext dc,                                  double radius, double length, double[] altitudes, boolean[] terrainConformant,                                  String type,                                  int arcSlices, int lengthSlices, int stacks, int orientation,                                  Vec4 referenceCenter)    {        Geometry vertexGeom = createLongCylinderVertexGeometry(dc, radius, length, altitudes,  terrainConformant, type,                                arcSlices, lengthSlices, stacks, orientation, referenceCenter);        Object cacheKey = new Geometry.CacheKey(this.getClass(), "LongCylinder.OutlineIndices",            arcSlices, lengthSlices, stacks, orientation);        Geometry outlineIndexGeom = (Geometry) this.getGeometryCache().getObject(cacheKey);        if (outlineIndexGeom == null)        {            outlineIndexGeom = new Geometry();            this.makeLongCylinderOutlineIndices(arcSlices, lengthSlices, stacks, orientation, outlineIndexGeom);            this.getGeometryCache().add(cacheKey, outlineIndexGeom);        }        this.getRenderer().drawGeometry(dc, outlineIndexGeom, vertexGeom);    }    private Geometry createLongCylinderVertexGeometry(DrawContext dc, double radius, double length,                                double[] altitudes, boolean[] terrainConformant, String type,                                int arcSlices, int lengthSlices, int stacks, int orientation,                                Vec4 referenceCenter)    {        Object cacheKey = new Geometry.CacheKey(this.getClass(), "LongCylinder.Vertices",            radius, length, altitudes[0], altitudes[1], terrainConformant[0], terrainConformant[1], type,            arcSlices, lengthSlices, stacks, orientation, referenceCenter);        Geometry vertexGeom = (Geometry) this.getGeometryCache().getObject(cacheKey);        if (vertexGeom == null || this.isExpired(dc, vertexGeom))        {            if (vertexGeom == null)                vertexGeom = new Geometry();            this.makeLongCylinder(dc, radius, length, altitudes, terrainConformant,                arcSlices, lengthSlices, stacks, orientation, referenceCenter, vertexGeom);            this.updateExpiryCriteria(dc, vertexGeom);            this.getGeometryCache().add(cacheKey, vertexGeom);        }        return vertexGeom;    }    private void makeLongCylinder(DrawContext dc,                                  double radius, double length, double[] altitudes, boolean[] terrainConformant,                                  int arcSlices, int lengthSlices, int stacks, int orientation,                                  Vec4 referenceCenter,                                  Geometry dest)    {        GeometryBuilder gb = this.getGeometryBuilder();        gb.setOrientation(orientation);        float height = (float) (altitudes[1] - altitudes[0]);        int count = gb.getLongCylinderVertexCount(arcSlices, lengthSlices, stacks);        int numCoords = 3 * count;        float[] verts = new float[numCoords];        float[] norms = new float[numCoords];        gb.makeLongCylinderVertices((float) radius, (float)length, height,            arcSlices, lengthSlices, stacks, verts);        this.makeLongCylinderTerrainConformant(dc, arcSlices, lengthSlices, stacks, verts,            altitudes, terrainConformant, referenceCenter);        gb.makeLongCylinderNormals(arcSlices, lengthSlices, stacks, norms);        dest.setVertexData(count, verts);        dest.setNormalData(count, norms);    }    private void makeLongCylinderTerrainConformant(DrawContext dc, int arcSlices, int lengthSlices, int stacks,                                                   float[] verts, double[] altitudes, boolean[] terrainConformant,                                                   Vec4 referenceCenter)    {        Globe globe = dc.getGlobe();        Matrix transform = this.computeTransform(dc);        int slices = 2 * (arcSlices + 1) + 2 * (lengthSlices - 1);        for (int i = 0; i < slices; i++)        {            int index = i;            index = 3 * index;            Vec4 vec = new Vec4(verts[index], verts[index + 1], verts[index + 2]);            vec = vec.transformBy4(transform);            Position p = globe.computePositionFromPoint(vec);            for (int j = 0; j <= stacks; j++)            {                double elevation = altitudes[j];                if (terrainConformant[j])                    elevation += this.computeElevationAt(dc, p.getLatitude(), p.getLongitude());                vec = globe.computePointFromPosition(p.getLatitude(), p.getLongitude(), elevation);                index = i + j * slices;                index = 3 * index;                verts[index]     = (float) (vec.x - referenceCenter.x);                verts[index + 1] = (float) (vec.y - referenceCenter.y);                verts[index + 2] = (float) (vec.z - referenceCenter.z);            }        }    }    private void makeLongCylinderIndices(int arcSlices, int lengthSlices, int stacks, int orientation,                                         Geometry dest)    {        GeometryBuilder gb = this.getGeometryBuilder();        gb.setOrientation(orientation);        int mode = gb.getLongCylinderDrawMode();        int count = gb.getLongCylinderIndexCount(arcSlices, lengthSlices, stacks);        int[] indices = new int[count];        gb.makeLongCylinderIndices(arcSlices, lengthSlices, stacks, indices);        dest.setElementData(mode, count, indices);    }    private void makeLongCylinderOutlineIndices(int arcSlices, int lengthSlices, int stacks, int orientation,                                         Geometry dest)    {        GeometryBuilder gb = this.getGeometryBuilder();        gb.setOrientation(orientation);        int mode = gb.getLongCylinderOutlineDrawMode();        int count = gb.getLongCylinderOutlineIndexCount(arcSlices, lengthSlices, stacks);        int[] indices = new int[count];        gb.makeLongCylinderOutlineIndices(arcSlices, lengthSlices, stacks, indices);        dest.setElementData(mode, count, indices);    }    //**************************************************************//    //********************  Long Disk           ********************//    //**************************************************************//    private void drawLongDisk(DrawContext dc,                              double[] radii, double length, double altitudes, boolean terrainConformant, String type,                              int arcSlices, int lengthSlices, int loops, int orientation,                              Vec4 referenceCenter)    {        Object cacheKey = new Geometry.CacheKey(this.getClass(), "LongDisk.Vertices",            radii[0], radii[1], length, altitudes, terrainConformant, type,            arcSlices, lengthSlices, loops, orientation,            referenceCenter);        Geometry vertexGeom = (Geometry) this.getGeometryCache().getObject(cacheKey);        if (vertexGeom == null || this.isExpired(dc, vertexGeom))        {            if (vertexGeom == null)                vertexGeom = new Geometry();            this.makeLongDisk(dc, radii, length, altitudes, terrainConformant,                arcSlices, lengthSlices, loops, orientation, referenceCenter, vertexGeom);            this.updateExpiryCriteria(dc, vertexGeom);            this.getGeometryCache().add(cacheKey, vertexGeom);        }        cacheKey = new Geometry.CacheKey(this.getClass(), "LongDisk.Indices",            arcSlices, lengthSlices, loops, orientation);        Geometry indexGeom = (Geometry) this.getGeometryCache().getObject(cacheKey);        if (indexGeom == null)        {            indexGeom = new Geometry();            this.makeLongDiskIndices(arcSlices, lengthSlices, loops, orientation, indexGeom);            this.getGeometryCache().add(cacheKey, indexGeom);        }        this.getRenderer().drawGeometry(dc, indexGeom, vertexGeom);    }    private void makeLongDisk(DrawContext dc,                              double[] radii, double length, double altitudes, boolean terrainConformant,                              int arcSlices, int lengthSlices, int loops, int orientation,                              Vec4 referenceCenter,                              Geometry dest)    {        GeometryBuilder gb = this.getGeometryBuilder();        gb.setOrientation(orientation);        int count = gb.getLongDiskVertexCount(arcSlices, lengthSlices, loops);        int numCoords = 3 * count;        float[] verts = new float[numCoords];        float[] norms = new float[numCoords];        gb.makeLongDiskVertices((float) radii[0], (float) radii[1], (float) length,            arcSlices, lengthSlices, loops, verts);        this.makeLongDiskTerrainConformant(dc, numCoords, verts,            altitudes, terrainConformant, referenceCenter);        gb.makeLongDiskVertexNormals((float) radii[0], (float) radii[1], (float) length,            arcSlices, lengthSlices, loops, verts, norms);        dest.setVertexData(count, verts);        dest.setNormalData(count, norms);    }    private void makeLongDiskTerrainConformant(DrawContext dc, int numCoords, float[] verts,                                               double altitude, boolean terrainConformant,                                               Vec4 referenceCenter)    {        Globe globe = dc.getGlobe();        Matrix transform = this.computeTransform(dc);        for (int i = 0; i < numCoords; i += 3)        {            Vec4 vec = new Vec4(verts[i], verts[i + 1], verts[i + 2]);            vec = vec.transformBy4(transform);            Position p = globe.computePositionFromPoint(vec);            double elevation = altitude;            if (terrainConformant)                elevation += this.computeElevationAt(dc, p.getLatitude(), p.getLongitude());            vec = globe.computePointFromPosition(p.getLatitude(), p.getLongitude(), elevation);            verts[i]     = (float) (vec.x - referenceCenter.x);            verts[i + 1] = (float) (vec.y - referenceCenter.y);            verts[i + 2] = (float) (vec.z - referenceCenter.z);        }    }    private void makeLongDiskIndices(int arcSlices, int lengthSlices, int loops, int orientation,                                     Geometry dest)    {        GeometryBuilder gb = this.getGeometryBuilder();        gb.setOrientation(orientation);        int mode = gb.getLongDiskDrawMode();        int count = gb.getLongDiskIndexCount(arcSlices, lengthSlices, loops);        int[] indices = new int[count];        gb.makeLongDiskIndices(arcSlices, lengthSlices, loops, indices);        dest.setElementData(mode, count, indices);    }    //**************************************************************//    //********************  END Geometry Rendering  ****************//    //**************************************************************//    @Override    protected void doGetRestorableState(RestorableSupport rs, RestorableSupport.StateObject context)    {        super.doGetRestorableState(rs, context);        rs.addStateValueAsLatLon(context, "location1", this.location1);        rs.addStateValueAsLatLon(context, "location2", this.location2);        rs.addStateValueAsString(context, "orbitType", this.orbitType);        rs.addStateValueAsDouble(context, "width", this.width);        rs.addStateValueAsBoolean(context, "enableCaps", this.enableCaps);    }    @Override    protected void doRestoreState(RestorableSupport rs, RestorableSupport.StateObject context)    {        super.doRestoreState(rs, context);                LatLon loc1 = rs.getStateValueAsLatLon(context, "location1");        if (loc1 == null)            loc1 = this.getLocations()[0];        LatLon loc2 = rs.getStateValueAsLatLon(context, "location2");        if (loc2 == null)            loc2 = this.getLocations()[1];        this.setLocations(loc1, loc2);        String s = rs.getStateValueAsString(context, "orbitType");        if (s != null)            this.setOrbitType(s);        Double d = rs.getStateValueAsDouble(context, "width");        if (d != null)            this.setWidth(d);        Boolean booleanState = rs.getStateValueAsBoolean(context, "enableCaps");        if (booleanState != null)            this.setEnableCaps(booleanState);    }}

⌨️ 快捷键说明

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