📄 renderer.java
字号:
if (mtype == MasterControl.REMOVEALLCTXS_CLEANUP) { // from MasterControl when View is last views removeAllCtxs(); } else if (mtype == MasterControl.FREECONTEXT_CLEANUP) { // from MasterControl freeContext(View v) cv = (Canvas3D) args[1]; removeCtx(cv, cv.screen.display, cv.drawable, cv.ctx, true, true, false); } else if (mtype == MasterControl.RESETCANVAS_CLEANUP) { // from MasterControl RESET_CANVAS postRequest cv = (Canvas3D) args[1]; if (cv.ctx != null) { cv.makeCtxCurrent(); } cv.freeContextResources(cv.screen.renderer, true, cv.ctx); } else if (mtype == MasterControl.REMOVECTX_CLEANUP) { // from Canvas3D removeCtx() postRequest Object[] obj = (Object []) args[1]; Canvas3D c = (Canvas3D) obj[0]; removeCtx(c, ((Long) obj[1]).longValue(), (Drawable) obj[2], (Context) obj[3], false, !c.offScreen, false); } return; } else { // RENDER || REQUESTRENDER int renderType; nmesg = 0; int totalMessages = 0; if (opArg == RENDER) { m = renderMessage; m[0] = new J3dMessage(); // Issue 131: Set appropriate message type if (((Canvas3D)args[1]).offScreen) { m[0].type = J3dMessage.RENDER_OFFSCREEN; } else { m[0].type = J3dMessage.RENDER_RETAINED; } m[0].incRefcount(); m[0].args[0] = args[1]; totalMessages = 1; } else { // REQUESTRENDER m = rendererStructure.getMessages(); totalMessages = rendererStructure.getNumMessage(); if (totalMessages <= 0) { return; } } doneRender: while (nmesg < totalMessages) { firstArg = m[nmesg].args[0]; if (firstArg == null) { Object secondArg = m[nmesg].args[1]; if (secondArg instanceof Canvas3D) { // message from Canvas3Ds to destroy Context Integer reqType = (Integer) m[nmesg].args[2]; Canvas3D c = (Canvas3D) secondArg; if (reqType == MasterControl.SET_GRAPHICSCONFIG_FEATURES) { try { if (c.offScreen) { // offScreen canvas neither supports // double buffering nor stereo c.doubleBufferAvailable = false; c.stereoAvailable = false; } else { c.doubleBufferAvailable = c.hasDoubleBuffer(); c.stereoAvailable = c.hasStereo(); } // Setup stencil related variables. c.actualStencilSize = c.getStencilSize(); boolean userOwnsStencil = c.requestedStencilSize > 0; c.userStencilAvailable = (userOwnsStencil && (c.actualStencilSize > 0)); c.systemStencilAvailable = (!userOwnsStencil && (c.actualStencilSize > 0)); c.sceneAntialiasingMultiSamplesAvailable = c.hasSceneAntialiasingMultisample(); if (c.sceneAntialiasingMultiSamplesAvailable) { c.sceneAntialiasingAvailable = true; } else { c.sceneAntialiasingAvailable = c.hasSceneAntialiasingAccum(); } } catch (RuntimeException ex) { ex.printStackTrace(); // Issue 260 : indicate fatal error and notify error listeners c.setFatalError(); RenderingError err = new RenderingError(RenderingError.GRAPHICS_CONFIG_ERROR, J3dI18N.getString("Renderer1")); err.setCanvas3D(c); err.setGraphicsDevice(c.graphicsConfiguration.getDevice()); notifyErrorListeners(err); } GraphicsConfigTemplate3D.runMonitor(J3dThread.NOTIFY); } else if (reqType == MasterControl.SET_QUERYPROPERTIES){ try { c.createQueryContext(); } catch (RuntimeException ex) { ex.printStackTrace(); // Issue 260 : indicate fatal error and notify error listeners c.setFatalError(); RenderingError err = new RenderingError(RenderingError.CONTEXT_CREATION_ERROR, J3dI18N.getString("Renderer2")); err.setCanvas3D(c); err.setGraphicsDevice(c.graphicsConfiguration.getDevice()); notifyErrorListeners(err); } // currentCtx change after we create a new context GraphicsConfigTemplate3D.runMonitor(J3dThread.NOTIFY); currentCtx = null; currentDrawable = null; } } else if (secondArg instanceof Integer) { // Issue 121 - This was formerly used as a message from // the now-nonexistant TextureRetained finalize() method // to free the texture id throw new AssertionError(); } else if (secondArg instanceof GeometryArrayRetained) { // message from GeometryArrayRetained // clearLive() to free D3D array ((GeometryArrayRetained) secondArg).freeD3DArray(false); } else if (secondArg instanceof GraphicsConfigTemplate3D) { GraphicsConfigTemplate3D gct = (GraphicsConfigTemplate3D) secondArg; Integer reqType = (Integer) m[nmesg].args[2]; if (reqType == MasterControl.GETBESTCONFIG) { GraphicsConfiguration gcfg = null; GraphicsConfiguration [] gcList = (GraphicsConfiguration []) gct.testCfg; try { gcfg = Pipeline.getPipeline().getBestConfiguration(gct, gcList); } catch (NullPointerException npe) { npe.printStackTrace(); } catch (RuntimeException ex) { ex.printStackTrace(); // Issue 260 : notify error listeners RenderingError err = new RenderingError(RenderingError.GRAPHICS_CONFIG_ERROR, J3dI18N.getString("Renderer3")); err.setGraphicsDevice(gcList[0].getDevice()); notifyErrorListeners(err); } gct.testCfg = gcfg; } else if (reqType == MasterControl.ISCONFIGSUPPORT) { boolean rval = false; GraphicsConfiguration gc = (GraphicsConfiguration) gct.testCfg; try { if (Pipeline.getPipeline().isGraphicsConfigSupported(gct, gc)) { rval = true; } } catch (NullPointerException npe) { npe.printStackTrace(); } catch (RuntimeException ex) { ex.printStackTrace(); // Issue 260 : notify error listeners RenderingError err = new RenderingError(RenderingError.GRAPHICS_CONFIG_ERROR, J3dI18N.getString("Renderer4")); err.setGraphicsDevice(gc.getDevice()); notifyErrorListeners(err); } gct.testCfg = Boolean.valueOf(rval); } gct.runMonitor(J3dThread.NOTIFY); } m[nmesg++].decRefcount(); continue; } canvas = (Canvas3D) firstArg; renderType = m[nmesg].type; if (renderType == J3dMessage.CREATE_OFFSCREENBUFFER) { // Fix for issue 18. // Fix for issue 20. canvas.drawable = null; try { // Issue 396. Pass in a null ctx for 2 reasons : // 1) We should not use ctx field directly without buffering in a msg. // 2) canvas.ctx should be null. canvas.drawable = canvas.createOffScreenBuffer(null, canvas.screen.display, canvas.fbConfig, canvas.offScreenCanvasSize.width, canvas.offScreenCanvasSize.height); } catch (RuntimeException ex) { ex.printStackTrace(); } if (canvas.drawable == null) { // Issue 260 : indicate fatal error and notify error listeners canvas.setFatalError(); RenderingError err = new RenderingError(RenderingError.OFF_SCREEN_BUFFER_ERROR, J3dI18N.getString("Renderer5")); err.setCanvas3D(canvas); err.setGraphicsDevice(canvas.graphicsConfiguration.getDevice()); notifyErrorListeners(err); } canvas.offScreenBufferPending = false; m[nmesg++].decRefcount(); continue; } else if (renderType == J3dMessage.DESTROY_CTX_AND_OFFSCREENBUFFER) { Object[] obj = m[nmesg].args; // Fix for issue 175: destroy ctx & off-screen buffer // Fix for issue 340: get display, drawable & ctx from msg removeCtx(canvas, ((Long) obj[1]).longValue(), (Drawable) obj[2], (Context) obj[3], false, !canvas.offScreen, true); canvas.offScreenBufferPending = false; m[nmesg++].decRefcount(); continue; } else if (renderType == J3dMessage.ALLOCATE_CANVASID) { canvas.allocateCanvasId(); } else if (renderType == J3dMessage.FREE_CANVASID) { canvas.freeCanvasId(); } if ((canvas.view == null) || !canvas.firstPaintCalled) { // This happen when the canvas just remove from the View if (renderType == J3dMessage.RENDER_OFFSCREEN) { canvas.offScreenRendering = false; } m[nmesg++].decRefcount(); continue; } if (!canvas.validCanvas && (renderType != J3dMessage.RENDER_OFFSCREEN)) { m[nmesg++].decRefcount(); continue; } if (renderType == J3dMessage.RESIZE_CANVAS) { canvas.d3dResize(); // render the image again after resize VirtualUniverse.mc.sendRunMessage(canvas.view, J3dThread.RENDER_THREAD); m[nmesg++].decRefcount(); } else if (renderType == J3dMessage.TOGGLE_CANVAS) { canvas.d3dToggle(); VirtualUniverse.mc.sendRunMessage(canvas.view, J3dThread.RENDER_THREAD); m[nmesg++].decRefcount(); } else if (renderType == J3dMessage.RENDER_IMMEDIATE) { int command = ((Integer)m[nmesg].args[1]).intValue(); //System.err.println("command= " + command); if (needToResendTextureDown) { VirtualUniverse.mc.resendTexTimestamp++; needToResendTextureDown = false; } if (canvas.isFatalError()) { continue; } try { if (canvas.ctx != null) { // ctx may not construct until doClear(); canvas.beginScene(); } switch (command) { case GraphicsContext3D.CLEAR: canvas.graphicsContext3D.doClear(); break; case GraphicsContext3D.DRAW: canvas.graphicsContext3D.doDraw( (Geometry)m[nmesg].args[2]); break; case GraphicsContext3D.SWAP: canvas.doSwap(); break; case GraphicsContext3D.READ_RASTER: canvas.graphicsContext3D.doReadRaster( (Raster)m[nmesg].args[2]); break; case GraphicsContext3D.SET_APPEARANCE: canvas.graphicsContext3D.doSetAppearance( (Appearance)m[nmesg].args[2]); break; case GraphicsContext3D.SET_BACKGROUND: canvas.graphicsContext3D.doSetBackground( (Background)m[nmesg].args[2]); break; case GraphicsContext3D.SET_FOG: canvas.graphicsContext3D.doSetFog( (Fog)m[nmesg].args[2]); break; case GraphicsContext3D.SET_LIGHT: canvas.graphicsContext3D.doSetLight( (Light)m[nmesg].args[2], ((Integer)m[nmesg].args[3]).intValue()); break; case GraphicsContext3D.INSERT_LIGHT: canvas.graphicsContext3D.doInsertLight( (Light)m[nmesg].args[2], ((Integer)m[nmesg].args[3]).intValue()); break; case GraphicsContext3D.REMOVE_LIGHT: canvas.graphicsContext3D.doRemoveLight( ((Integer)m[nmesg].args[2]).intValue()); break; case GraphicsContext3D.ADD_LIGHT: canvas.graphicsContext3D.doAddLight( (Light)m[nmesg].args[2]); break; case GraphicsContext3D.SET_HI_RES: canvas.graphicsContext3D.doSetHiRes( (HiResCoord)m[nmesg].args[2]); break; case GraphicsContext3D.SET_MODEL_TRANSFORM: t3d = (Transform3D)m[nmesg].args[2]; canvas.graphicsContext3D.doSetModelTransform(t3d); break; case GraphicsContext3D.MULTIPLY_MODEL_TRANSFORM: t3d = (Transform3D)m[nmesg].args[2]; canvas.graphicsContext3D.doMultiplyModelTransform(t3d); break; case GraphicsContext3D.SET_SOUND: canvas.graphicsContext3D.doSetSound( (Sound)m[nmesg].args[2],
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -