📄 renderer.java
字号:
((Integer)m[nmesg].args[3]).intValue()); break; case GraphicsContext3D.INSERT_SOUND: canvas.graphicsContext3D.doInsertSound( (Sound)m[nmesg].args[2], ((Integer)m[nmesg].args[3]).intValue()); break; case GraphicsContext3D.REMOVE_SOUND: canvas.graphicsContext3D.doRemoveSound( ((Integer)m[nmesg].args[2]).intValue()); break; case GraphicsContext3D.ADD_SOUND: canvas.graphicsContext3D.doAddSound( (Sound)m[nmesg].args[2]); break; case GraphicsContext3D.SET_AURAL_ATTRIBUTES: canvas.graphicsContext3D.doSetAuralAttributes( (AuralAttributes)m[nmesg].args[2]); break; case GraphicsContext3D.SET_BUFFER_OVERRIDE: canvas.graphicsContext3D.doSetBufferOverride( ((Boolean)m[nmesg].args[2]).booleanValue()); break; case GraphicsContext3D.SET_FRONT_BUFFER_RENDERING: canvas.graphicsContext3D.doSetFrontBufferRendering( ((Boolean)m[nmesg].args[2]).booleanValue()); break; case GraphicsContext3D.SET_STEREO_MODE: canvas.graphicsContext3D.doSetStereoMode( ((Integer)m[nmesg].args[2]).intValue()); break; case GraphicsContext3D.FLUSH: canvas.graphicsContext3D.doFlush( ((Boolean)m[nmesg].args[2]).booleanValue()); break; case GraphicsContext3D.FLUSH2D: canvas.graphics2D.doFlush(); break; case GraphicsContext3D.DRAWANDFLUSH2D: Object ar[] = m[nmesg].args; canvas.graphics2D.doDrawAndFlushImage( (BufferedImage) ar[2], ((Point) ar[3]).x, ((Point) ar[3]).y, (ImageObserver) ar[4]); break; case GraphicsContext3D.DISPOSE2D: canvas.graphics2D.doDispose(); break; case GraphicsContext3D.SET_MODELCLIP: canvas.graphicsContext3D.doSetModelClip( (ModelClip)m[nmesg].args[2]); break; default: break; } if (canvas.ctx != null) { canvas.endScene(); } } catch (RuntimeException ex) { ex.printStackTrace(); // Issue 260 : indicate fatal error and notify error listeners canvas.setFatalError(); RenderingError err = new RenderingError(RenderingError.CONTEXT_CREATION_ERROR, J3dI18N.getString("Renderer6")); err.setCanvas3D(canvas); err.setGraphicsDevice(canvas.graphicsConfiguration.getDevice()); notifyErrorListeners(err); } m[nmesg++].decRefcount(); } else { // retained mode rendering long startRenderTime = 0L; if (MasterControl.isStatsLoggable(Level.INFO)) { // Instrumentation of Java 3D renderer startRenderTime = System.nanoTime(); } m[nmesg++].decRefcount(); if (canvas.isFatalError()) { continue; } ImageComponent2DRetained offBufRetained = null; if (renderType == J3dMessage.RENDER_OFFSCREEN) { // Issue 131: set offScreenRendering flag here, since it // otherwise won't be set for auto-off-screen rendering // (which doesn't use renderOffScreenBuffer) canvas.offScreenRendering = true; if (canvas.drawable == null || !canvas.active) { canvas.offScreenRendering = false; continue; } else { offBufRetained = (ImageComponent2DRetained) canvas.offScreenBuffer.retained; if (offBufRetained.isByReference()) { offBufRetained.geomLock.getLock(); } offBufRetained.evaluateExtensions(canvas); } } else if (!canvas.active) { continue; } // Issue 78 - need to get the drawingSurface info every // frame; this is necessary since the HDC (window ID) // on Windows can become invalidated without our // being notified! if (!canvas.offScreen) { canvas.drawingSurfaceObject.getDrawingSurfaceObjectInfo(); } renderBin = canvas.view.renderBin; // setup rendering context // We need to catch NullPointerException when the dsi // gets yanked from us during a remove. if (canvas.useSharedCtx) { if (sharedCtx == null) { sharedCtxDisplay = canvas.screen.display; sharedCtxDrawable = canvas.drawable; // Always lock for context create if (!canvas.drawingSurfaceObject.renderLock()) { if ((offBufRetained != null) && offBufRetained.isByReference()) { offBufRetained.geomLock.unLock(); } canvas.offScreenRendering = false; break doneRender; } synchronized (VirtualUniverse.mc.contextCreationLock) { sharedCtx = null; try { sharedCtx = canvas.createNewContext(null, true); } catch (RuntimeException ex) { ex.printStackTrace(); } if (sharedCtx == null) { canvas.drawingSurfaceObject.unLock(); if ((offBufRetained != null) && offBufRetained.isByReference()) { offBufRetained.geomLock.unLock(); } canvas.offScreenRendering = false; // Issue 260 : indicate fatal error and notify error listeners canvas.setFatalError(); RenderingError err = new RenderingError(RenderingError.CONTEXT_CREATION_ERROR, J3dI18N.getString("Renderer7")); err.setCanvas3D(canvas); err.setGraphicsDevice(canvas.graphicsConfiguration.getDevice()); notifyErrorListeners(err); break doneRender; } sharedCtxTimeStamp = VirtualUniverse.mc.getContextTimeStamp(); needToRebuildDisplayList = true; } canvas.drawingSurfaceObject.unLock(); } } if (canvas.ctx == null) { // Always lock for context create if (!canvas.drawingSurfaceObject.renderLock()) { if ((offBufRetained != null) && offBufRetained.isByReference()) { offBufRetained.geomLock.unLock(); } canvas.offScreenRendering = false; break doneRender; } synchronized (VirtualUniverse.mc.contextCreationLock) { canvas.ctx = null; try { canvas.ctx = canvas.createNewContext(sharedCtx, false); } catch (RuntimeException ex) { ex.printStackTrace(); } if (canvas.ctx == null) { canvas.drawingSurfaceObject.unLock(); if ((offBufRetained != null) && offBufRetained.isByReference()) { offBufRetained.geomLock.unLock(); } canvas.offScreenRendering = false; // Issue 260 : indicate fatal error and notify error listeners canvas.setFatalError(); RenderingError err = new RenderingError(RenderingError.CONTEXT_CREATION_ERROR, J3dI18N.getString("Renderer7")); err.setCanvas3D(canvas); err.setGraphicsDevice(canvas.graphicsConfiguration.getDevice()); notifyErrorListeners(err); break doneRender; } if (canvas.graphics2D != null) { canvas.graphics2D.init(); } canvas.ctxTimeStamp = VirtualUniverse.mc.getContextTimeStamp(); listOfCtxs.add(canvas.ctx); listOfCanvases.add(canvas); if (renderBin.nodeComponentList.size() > 0) { for (i = 0; i < renderBin.nodeComponentList.size(); i++) { NodeComponentRetained nc = (NodeComponentRetained)renderBin.nodeComponentList.get(i); if(nc instanceof ImageComponentRetained) { ((ImageComponentRetained)nc).evaluateExtensions(canvas); } } } // enable separate specular color canvas.enableSeparateSpecularColor(); } // create the cache texture state in canvas // for state download checking purpose if (canvas.texUnitState == null) { canvas.createTexUnitState(); } canvas.resetImmediateRendering(Canvas3D.NOCHANGE); canvas.drawingSurfaceObject.contextValidated(); if (!canvas.useSharedCtx) { canvas.needToRebuildDisplayList = true; } canvas.drawingSurfaceObject.unLock(); } else { if (canvas.isRunning) { canvas.makeCtxCurrent(); } } if (renderBin != null) { if ((VirtualUniverse.mc.doDsiRenderLock) && (!canvas.drawingSurfaceObject.renderLock())) { if ((offBufRetained != null) && offBufRetained.isByReference()) { offBufRetained.geomLock.unLock(); } canvas.offScreenRendering = false; break doneRender; } if (needToResendTextureDown) { VirtualUniverse.mc.resendTexTimestamp++; needToResendTextureDown = false; } // handle free resource if (canvas.useSharedCtx) { freeResourcesInFreeList(canvas); } else { canvas.freeResourcesInFreeList(canvas.ctx); } if (VirtualUniverse.mc.doDsiRenderLock) { canvas.drawingSurfaceObject.unLock(); } // Issue 109 : removed copyOfCvCache now that we have // a separate canvasViewCache for computing view frustum CanvasViewCache cvCache = canvas.canvasViewCache; // Deadlock if we include updateViewCache in // drawingSurfaceObject sync. canvas.updateViewCache(false, null, null, renderBin.geometryBackground != null); if ((VirtualUniverse.mc.doDsiRenderLock) && (!canvas.drawingSurfaceObject.renderLock())) { if ((offBufRetained != null) && offBufRetained.isByReference()) { offBufRetained.geomLock.unLock(); } canvas.offScreenRendering = false; break doneRender; } // setup viewport canvas.setViewport(canvas.ctx, 0, 0, cvCache.getCanvasWidth(), cvCache.getCanvasHeight()); // rebuild the display list of all dirty renderMolecules. if (canvas.useSharedCtx) { if (needToRebuildDisplayList) { renderBin.updateAllRenderMolecule( this, canvas); needToRebuildDisplayList = false; } if (dirtyDisplayList) { renderBin.updateDirtyDisplayLists(canvas, dirtyRenderMoleculeList, dirtyDlistPerRinfoList, dirtyRenderAtomList,true); dirtyDisplayList = false; } // for shared context, download textures upfront // to minimize the context switching overhead int sz = textureReloadList.size(); if (sz > 0) { for (j = sz-1; j>=0; j--) { ((TextureRetained)textureReloadList.get(j)). reloadTextureSharedContext(canvas); } textureReloadList.clear(); } } else { // update each canvas if (canvas.needToRebuildDisplayList) { renderBin.updateAllRenderMolecule(canvas); canvas.needToRebuildDisplayList = false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -