📄 abstractscenecontroller.java
字号:
dc.getGL().glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); } protected void finalizeFrame(DrawContext dc) { GL gl = dc.getGL(); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glPopMatrix(); gl.glMatrixMode(GL.GL_PROJECTION); gl.glPopMatrix(); gl.glPopAttrib();// checkGLErrors(dc); } protected void applyView(DrawContext dc) { if (dc.getView() != null) dc.getView().apply(dc); } protected void createTerrain(DrawContext dc) { if (dc.getSurfaceGeometry() == null) { if (dc.getModel() != null && dc.getModel().getGlobe() != null) { SectorGeometryList sgl = dc.getModel().getGlobe().tessellate(dc); dc.setSurfaceGeometry(sgl); dc.setVisibleSector(sgl.getSector()); } if (dc.getSurfaceGeometry() == null) { Logging.logger().warning("generic.NoSurfaceGeometry"); dc.setPerFrameStatistic(PerformanceStatistic.TERRAIN_TILE_COUNT, "Terrain Tiles", 0); // keep going because some layers, etc. may have meaning w/o surface geometry } dc.setPerFrameStatistic(PerformanceStatistic.TERRAIN_TILE_COUNT, "Terrain Tiles", dc.getSurfaceGeometry().size()); } } protected void preRender(DrawContext dc) { if (dc.getLayers() == null) return; for (Layer layer : dc.getLayers()) { try { dc.setCurrentLayer(layer); layer.preRender(dc); } catch (Exception e) { String message = Logging.getMessage("SceneController.ExceptionWhilePickingInLayer", (layer != null ? layer.getClass().getName() : Logging.getMessage("term.unknown"))); Logging.logger().log(Level.SEVERE, message, e); // Don't abort; continue on to the next layer. } } dc.setCurrentLayer(null); } private ArrayList<Point> pickPoints = new ArrayList<Point>(); protected void pickTerrain(DrawContext dc) { if (dc.isPickingMode() && dc.getVisibleSector() != null && dc.getSurfaceGeometry() != null && dc.getSurfaceGeometry().size() > 0) { this.pickPoints.clear(); if (dc.getPickPoint() != null) this.pickPoints.add(dc.getPickPoint()); // Clear viewportCenterPosition. dc.setViewportCenterPosition(null); Point vpc = dc.getViewportCenterScreenPoint(); if (vpc != null) this.pickPoints.add(vpc); if (this.pickPoints.size() == 0) return; List<PickedObject> pickedObjects = dc.getSurfaceGeometry().pick(dc, this.pickPoints); if (pickedObjects == null || pickedObjects.size() == 0) return; for (PickedObject po : pickedObjects) { if (po == null) continue; if (po.getPickPoint().equals(dc.getPickPoint())) dc.addPickedObject(po); else if (po.getPickPoint().equals(vpc)) dc.setViewportCenterPosition((Position) po.getObject()); } } } protected void pickLayers(DrawContext dc) { if (dc.getLayers() != null) { for (Layer layer : dc.getLayers()) { try { if (layer != null && layer.isPickEnabled()) { dc.setCurrentLayer(layer); layer.pick(dc, dc.getPickPoint()); } } catch (Exception e) { String message = Logging.getMessage("SceneController.ExceptionWhilePickingInLayer", (layer != null ? layer.getClass().getName() : Logging.getMessage("term.unknown"))); Logging.logger().log(Level.SEVERE, message, e); // Don't abort; continue on to the next layer. } } dc.setCurrentLayer(null); } } protected void resolveTopPick(DrawContext dc) { // Make a last reading to find out which is a top (resultant) color PickedObjectList pickedObjectsList = dc.getPickedObjects(); if (pickedObjectsList != null && (pickedObjectsList.size() == 1)) { pickedObjectsList.get(0).setOnTop(); } else if (pickedObjectsList != null && (pickedObjectsList.size() > 1)) { int[] viewport = new int[4]; java.nio.ByteBuffer pixel = com.sun.opengl.util.BufferUtil.newByteBuffer(3); GL gl = dc.getGL(); gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0); gl.glReadPixels(dc.getPickPoint().x, viewport[3] - dc.getPickPoint().y, 1, 1, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, pixel); Color topColor = new Color(pixel.get(0) & 0xff, pixel.get(1) & 0xff, pixel.get(2) & 0xff, 0); int colorCode = topColor.getRGB(); if (0 != colorCode) { // let's find the picked object in the list and set "OnTop" flag for (PickedObject po : pickedObjectsList) { if (null != po && po.getColorCode() == colorCode) { po.setOnTop(); break; } } } } // end of top pixel reading } protected void pick(DrawContext dc) { this.pickTime = System.currentTimeMillis(); this.lastPickedObjects = null; try { dc.enablePickingMode(); this.pickTerrain(dc); if (dc.getPickPoint() == null) return; this.pickLayers(dc); // Pick against the deferred/ordered renderables while (dc.getOrderedRenderables().peek() != null) { dc.getOrderedRenderables().poll().pick(dc, dc.getPickPoint()); } this.resolveTopPick(dc); this.lastPickedObjects = new PickedObjectList(dc.getPickedObjects()); } catch (Throwable e) { Logging.logger().log(Level.SEVERE, Logging.getMessage("BasicSceneController.ExceptionDuringPick"), e); } finally { dc.disablePickingMode(); this.pickTime = System.currentTimeMillis() - this.pickTime; } } protected void draw(DrawContext dc) { try { if (dc.getLayers() != null) { for (Layer layer : dc.getLayers()) { try { if (layer != null) { dc.setCurrentLayer(layer); layer.render(dc); } } catch (Exception e) { String message = Logging.getMessage("SceneController.ExceptionWhileRenderingLayer", (layer != null ? layer.getClass().getName() : Logging.getMessage("term.unknown"))); Logging.logger().log(Level.SEVERE, message, e); // Don't abort; continue on to the next layer. } } dc.setCurrentLayer(null); } while (dc.getOrderedRenderables().peek() != null) { dc.getOrderedRenderables().poll().render(dc); } // Diagnostic displays. if (dc.getSurfaceGeometry() != null && dc.getModel() != null && (dc.getModel().isShowWireframeExterior() || dc.getModel().isShowWireframeInterior() || dc.getModel().isShowTessellationBoundingVolumes())) { Model model = dc.getModel(); float[] previousColor = new float[4]; dc.getGL().glGetFloatv(GL.GL_CURRENT_COLOR, previousColor, 0); for (SectorGeometry sg : dc.getSurfaceGeometry()) { if (model.isShowWireframeInterior() || model.isShowWireframeExterior()) sg.renderWireframe(dc, model.isShowWireframeInterior(), model.isShowWireframeExterior()); if (model.isShowTessellationBoundingVolumes()) { dc.getGL().glColor3d(1, 0, 0); sg.renderBoundingVolume(dc); } } dc.getGL().glColor4fv(previousColor, 0); } } catch (Throwable e) { Logging.logger().log(Level.SEVERE, Logging.getMessage("BasicSceneController.ExceptionDuringRendering"), e); } } /** * Called to check for openGL errors. This method includes a "round-trip" between the application and renderer, * which is slow. Therefore, this method is excluded from the "normal" render pass. It is here as a matter of * convenience to developers, and is not part of the API. * * @param dc the relevant <code>DrawContext</code> */ @SuppressWarnings({"UNUSED_SYMBOL", "UnusedDeclaration"}) protected void checkGLErrors(DrawContext dc) { GL gl = dc.getGL(); for (int err = gl.glGetError(); err != GL.GL_NO_ERROR; err = gl.glGetError()) { String msg = dc.getGLU().gluErrorString(err); msg += err; Logging.logger().severe(msg); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -