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 + -
显示快捷键?