📄 abstractscenecontroller.java
字号:
/*Copyright (C) 2001, 2006 United States Governmentas represented by the Administrator of theNational Aeronautics and Space Administration.All Rights Reserved.*/package gov.nasa.worldwind;import gov.nasa.worldwind.avlist.*;import gov.nasa.worldwind.cache.*;import gov.nasa.worldwind.geom.*;import gov.nasa.worldwind.layers.*;import gov.nasa.worldwind.pick.*;import gov.nasa.worldwind.render.*;import gov.nasa.worldwind.terrain.*;import gov.nasa.worldwind.util.Logging;import gov.nasa.worldwind.util.*;import javax.media.opengl.*;import java.awt.*;import java.util.*;import java.util.List;import java.util.logging.Level;/** * @author tag * @version $Id: AbstractSceneController.java 8732 2009-02-03 17:35:26Z tgaskins $ */public abstract class AbstractSceneController extends WWObjectImpl implements SceneController{ private Model model; private View view; private double verticalExaggeration = 1d; private DrawContext dc = new DrawContextImpl(); private PickedObjectList lastPickedObjects;// These are for tracking performance private long frame = 0; private long timebase = System.currentTimeMillis(); private double framesPerSecond; private double frameTime; private double pickTime; private Point pickPoint = null; private TextureCache textureCache; private TextRendererCache textRendererCache = new TextRendererCache(); private Set<String> perFrameStatisticsKeys = new HashSet<String>(); private Collection<PerformanceStatistic> perFrameStatistics = new ArrayList<PerformanceStatistic>(); public AbstractSceneController() { this.setVerticalExaggeration(Configuration.getDoubleValue(AVKey.VERTICAL_EXAGGERATION, 1d)); } public void reinitialize() { if (this.textRendererCache != null) this.textRendererCache.dispose(); this.textRendererCache = new TextRendererCache(); } /** Releases resources associated with this scene controller. */ public void dispose() { if (this.lastPickedObjects != null) this.lastPickedObjects.clear(); this.lastPickedObjects = null; if (this.dc != null) this.dc.dispose(); if (this.textRendererCache != null) this.textRendererCache.dispose(); } public TextureCache getTextureCache() { return textureCache; } public void setTextureCache(TextureCache textureCache) { this.textureCache = textureCache; } public TextRendererCache getTextRendererCache() { return textRendererCache; } public Model getModel() { return this.model; } public View getView() { return this.view; } public void setModel(Model model) { if (this.model != null) this.model.removePropertyChangeListener(this); if (model != null) model.addPropertyChangeListener(this); Model oldModel = this.model; this.model = model; this.firePropertyChange(AVKey.MODEL, oldModel, model); } public void setView(View view) { if (this.view != null) this.view.removePropertyChangeListener(this); if (view != null) view.addPropertyChangeListener(this); View oldView = this.view; this.view = view; this.firePropertyChange(AVKey.VIEW, oldView, view); } public void setVerticalExaggeration(double verticalExaggeration) { Double oldVE = this.verticalExaggeration; this.verticalExaggeration = verticalExaggeration; this.firePropertyChange(AVKey.VERTICAL_EXAGGERATION, oldVE, verticalExaggeration); } public double getVerticalExaggeration() { return this.verticalExaggeration; } public void setPickPoint(java.awt.Point pickPoint) { this.pickPoint = pickPoint; } public Point getPickPoint() { return this.pickPoint; } public PickedObjectList getPickedObjectList() { return this.lastPickedObjects; } protected void setPickedObjectList(PickedObjectList pol) { this.lastPickedObjects = pol; } public SectorGeometryList getTerrain() { return this.dc.getSurfaceGeometry(); } public DrawContext getDrawContext() { return this.dc; } public double getFramesPerSecond() { return this.framesPerSecond; } public double getFrameTime() { return this.frameTime; } public void setPerFrameStatisticsKeys(Set<String> keys) { this.perFrameStatisticsKeys.clear(); if (keys == null) return; for (String key : keys) { if (key != null) this.perFrameStatisticsKeys.add(key); } } public Collection<PerformanceStatistic> getPerFrameStatistics() { return perFrameStatistics; } public void repaint() { this.frameTime = System.currentTimeMillis(); this.perFrameStatistics.clear(); this.initializeDrawContext(this.dc); this.doRepaint(this.dc); ++this.frame; long time = System.currentTimeMillis(); this.frameTime = System.currentTimeMillis() - this.frameTime; if (time - this.timebase > 2000) // recalculate every three seconds { this.framesPerSecond = frame * 1000d / (time - timebase); this.timebase = time; this.frame = 0; } this.dc.setPerFrameStatistic(PerformanceStatistic.FRAME_TIME, "Frame Time (ms)", (int) this.frameTime); this.dc.setPerFrameStatistic(PerformanceStatistic.FRAME_RATE, "Frame Rate (fps)", (int) this.framesPerSecond); this.dc.setPerFrameStatistic(PerformanceStatistic.PICK_TIME, "Pick Time (ms)", (int) this.pickTime); Set<String> perfKeys = dc.getPerFrameStatisticsKeys(); if (perfKeys == null) return; if (perfKeys.contains(PerformanceStatistic.MEMORY_CACHE) || perfKeys.contains(PerformanceStatistic.ALL)) { this.dc.setPerFrameStatistics(WorldWind.getMemoryCacheSet().getPerformanceStatistics()); } if (perfKeys.contains(PerformanceStatistic.TEXTURE_CACHE) || perfKeys.contains(PerformanceStatistic.ALL)) { if (dc.getTextureCache() != null) this.dc.setPerFrameStatistic(PerformanceStatistic.TEXTURE_CACHE, "Texture Cache size (Kb)", this.dc.getTextureCache().getUsedCapacity() / 1000); } } abstract protected void doRepaint(DrawContext dc); private void initializeDrawContext(DrawContext dc) { dc.initialize(GLContext.getCurrent()); dc.setPerFrameStatisticsKeys(this.perFrameStatisticsKeys, this.perFrameStatistics); dc.setTextureCache(this.textureCache); dc.setTextRendererCache(this.textRendererCache); dc.setModel(this.model); dc.setView(this.view); dc.setVerticalExaggeration(this.verticalExaggeration); dc.setPickPoint(this.pickPoint); dc.setViewportCenterScreenPoint(this.getViewportCenter(dc)); dc.setFrameTimeStamp(System.currentTimeMillis()); } private Point getViewportCenter(DrawContext dc) { View view = dc.getView(); if (view == null) return null; Rectangle viewport = view.getViewport(); if (viewport == null) return null; return new Point((int) (viewport.getCenterX() + 0.5), (int) (viewport.getCenterY() + 0.5)); } protected void initializeFrame(DrawContext dc) { if (dc.getGLContext() == null) { String message = Logging.getMessage("BasicSceneController.GLContextNullStartRedisplay"); Logging.logger().severe(message); throw new IllegalStateException(message); } javax.media.opengl.GL gl = dc.getGL(); gl.glPushAttrib(GL.GL_VIEWPORT_BIT | GL.GL_ENABLE_BIT | GL.GL_TRANSFORM_BIT); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glPushMatrix(); gl.glLoadIdentity(); gl.glMatrixMode(GL.GL_PROJECTION); gl.glPushMatrix(); gl.glLoadIdentity(); gl.glEnable(GL.GL_DEPTH_TEST); } protected void clearFrame(DrawContext dc) { Color cc = dc.getClearColor(); dc.getGL().glClearColor(cc.getRed(), cc.getGreen(), cc.getBlue(), cc.getAlpha());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -