📄 renderer.java
字号:
} if (canvas.dirtyDisplayList) { renderBin.updateDirtyDisplayLists(canvas, canvas.dirtyRenderMoleculeList, canvas.dirtyDlistPerRinfoList, canvas.dirtyRenderAtomList, false); canvas.dirtyDisplayList = false; } } // lighting setup if (canvas.view.localEyeLightingEnable != canvas.ctxEyeLightingEnable) { canvas.ctxUpdateEyeLightingEnable(canvas.ctx, canvas.view.localEyeLightingEnable); canvas.ctxEyeLightingEnable = canvas.view.localEyeLightingEnable; } // stereo setup boolean useStereo = cvCache.getUseStereo(); if (useStereo) { num_stereo_passes = 2; stereo_mode = Canvas3D.FIELD_LEFT; sharedStereoZBuffer = VirtualUniverse.mc.sharedStereoZBuffer; } else { num_stereo_passes = 1; stereo_mode = Canvas3D.FIELD_ALL; // just in case user set flag - // disable since we are not in stereo sharedStereoZBuffer = false; } // full screen anti-aliasing setup if (canvas.view.getSceneAntialiasingEnable() && canvas.sceneAntialiasingAvailable) { if (!VirtualUniverse.mc.isD3D() && ((canvas.extensionsSupported & Canvas3D.MULTISAMPLE) == 0) || !canvas.sceneAntialiasingMultiSamplesAvailable) { doAccum = true; num_accum_passes = NUM_ACCUMULATION_SAMPLES; System.arraycopy( cvCache.getLeftProjection().mat, 0, accumLeftProj.mat, 0, 16); accumDxFactor = ( canvas.canvasViewCache.getPhysicalWindowWidth() / canvas.canvasViewCache.getCanvasWidth())*canvas.view.fieldOfView; accumDyFactor = ( canvas.canvasViewCache.getPhysicalWindowHeight() / canvas.canvasViewCache.getCanvasHeight())*canvas.view.fieldOfView; accumLeftX = accumLeftProj.mat[3]; accumLeftY = accumLeftProj.mat[7]; if (useStereo) { System.arraycopy( cvCache.getRightProjection().mat, 0, accumRightProj.mat, 0, 16); accumRightX = accumRightProj.mat[3]; accumRightY = accumRightProj.mat[7]; } if (renderBin.geometryBackground != null) { System.arraycopy( cvCache.getInfLeftProjection().mat, 0, accumInfLeftProj.mat, 0, 16); accumInfLeftX = accumInfLeftProj.mat[3]; accumInfLeftY = accumInfLeftProj.mat[7]; if (useStereo) { System.arraycopy( cvCache.getInfRightProjection().mat, 0, accumInfRightProj.mat, 0, 16); accumInfRightX = accumInfRightProj.mat[3]; accumInfRightY = accumInfRightProj.mat[7]; } } } else { if (!canvas.antialiasingSet) { // System.err.println("Renderer : Enable FullSceneAntialiasing"); canvas.setFullSceneAntialiasing(canvas.ctx, true); canvas.antialiasingSet = true; } } } else { if (canvas.antialiasingSet) { // System.err.println("Renderer : Disable SceneAntialiasing"); canvas.setFullSceneAntialiasing(canvas.ctx, false); canvas.antialiasingSet = false; } } // background geometry setup if (renderBin.geometryBackground != null) { renderBin.updateInfVworldToVpc(); } // setup default render mode - render to both eyes canvas.setRenderMode(canvas.ctx, Canvas3D.FIELD_ALL, canvas.useDoubleBuffer); canvas.beginScene(); // this is if the background image resizes with the canvas int winWidth = cvCache.getCanvasWidth(); int winHeight = cvCache.getCanvasHeight(); // clear background if not full screen antialiasing // and not in stereo mode if (!doAccum && !sharedStereoZBuffer) { BackgroundRetained bg = renderBin.background; canvas.clear(bg, winWidth, winHeight); } // handle preRender callback if (VirtualUniverse.mc.doDsiRenderLock) { canvas.drawingSurfaceObject.unLock(); } canvas.view.inCanvasCallback = true; try { canvas.preRender(); } catch (RuntimeException e) { System.err.println("Exception occurred during Canvas3D callback:"); e.printStackTrace(); } catch (Error e) { // Issue 264 - catch Error so Renderer doesn't die System.err.println("Error occurred during Canvas3D callback:"); e.printStackTrace(); } canvas.view.inCanvasCallback = false; if ((VirtualUniverse.mc.doDsiRenderLock) && (!canvas.drawingSurfaceObject.renderLock())) { if ((offBufRetained != null) && offBufRetained.isByReference()) { offBufRetained.geomLock.unLock(); } canvas.offScreenRendering = false; break doneRender; } // render loop for (pass = 0; pass < num_stereo_passes; pass++) { if (doAccum) { canvas.clearAccum(canvas.ctx); } canvas.setRenderMode(canvas.ctx, stereo_mode, canvas.useDoubleBuffer); for (apass = 0; apass < num_accum_passes; apass++) { // jitter projection matrix and clear background // for full screen anti-aliasing rendering if (doAccum) { accumDx = ACCUM_SAMPLES_X[apass] * accumDxFactor; accumDy = ACCUM_SAMPLES_Y[apass] * accumDyFactor; accumLeftProj.mat[3] = accumLeftX + accumLeftProj.mat[0] * accumDx + accumLeftProj.mat[1] * accumDy; accumLeftProj.mat[7] = accumLeftY + accumLeftProj.mat[4] * accumDx + accumLeftProj.mat[5] * accumDy; if (useStereo) { accumRightProj.mat[3] = accumRightX + accumRightProj.mat[0] * accumDx + accumRightProj.mat[1] * accumDy; accumRightProj.mat[7] = accumRightY + accumRightProj.mat[4] * accumDx + accumRightProj.mat[5] * accumDy; } if (renderBin.geometryBackground != null) { accumInfLeftProj.mat[3] = accumInfLeftX + accumInfLeftProj.mat[0] * accumDx + accumInfLeftProj.mat[1] * accumDy; accumInfLeftProj.mat[7] = accumInfLeftY + accumInfLeftProj.mat[4] * accumDx + accumInfLeftProj.mat[5] * accumDy; if (useStereo) { accumInfRightProj.mat[3] = accumInfRightX + accumInfRightProj.mat[0] * accumDx + accumInfRightProj.mat[1] * accumDy; accumInfRightProj.mat[7] = accumInfRightY + accumInfRightProj.mat[4] * accumDx + accumInfRightProj.mat[5] * accumDy; } } } // clear background for stereo and // accumulation buffer cases if (doAccum || sharedStereoZBuffer) { BackgroundRetained bg = renderBin.background; canvas.clear(bg, winWidth, winHeight); } // render background geometry if (renderBin.geometryBackground != null) { // setup rendering matrices if (pass == 0) { canvas.vpcToEc = cvCache.getInfLeftVpcToEc(); if (doAccum) { canvas.setProjectionMatrix( canvas.ctx, accumInfLeftProj); } else { canvas.setProjectionMatrix( canvas.ctx, cvCache.getInfLeftProjection()); } } else { canvas.vpcToEc = cvCache.getInfRightVpcToEc(); if (doAccum) { canvas.setProjectionMatrix( canvas.ctx, accumInfRightProj); } else { canvas.setProjectionMatrix( canvas.ctx, cvCache.getInfRightProjection()); } } canvas.vworldToEc.mul(canvas.vpcToEc, cvCache.getInfVworldToVpc()); // render background geometry renderBin.renderBackground(canvas); } // setup rendering matrices if (pass == 0) { canvas.vpcToEc = cvCache.getLeftVpcToEc(); if (doAccum) { canvas.setProjectionMatrix(canvas.ctx, accumLeftProj); } else { canvas.setProjectionMatrix(canvas.ctx, cvCache.getLeftProjection()); } } else { canvas.vpcToEc = cvCache.getRightVpcToEc(); if (doAccum) { canvas.setProjectionMatrix( canvas.ctx, accumRightProj); } else { canvas.setProjectionMatrix(canvas.ctx, cvCache.getRightProjection()); } } canvas.vworldToEc.mul(canvas.vpcToEc, cvCache.getVworldToVpc()); synchronized (cvCache) { if (pass == 0) { canvas.setFrustumPlanes(cvCache.getLeftFrustumPlanesInVworld()); } else { canvas.setFrustumPlanes(cvCache.getRightFrustumPlanesInVworld()); } } // Force view matrix dirty for each eye. if (useStereo) { canvas.canvasDirty |= Canvas3D.VIEW_MATRIX_DIRTY; } // render opaque geometry renderBin.renderOpaque(canvas); // render ordered geometry renderBin.renderOrdered(canvas); // handle renderField callback if (VirtualUniverse.mc.doDsiRenderLock) { canvas.drawingSurfaceObject.unLock(); } canvas.view.inCanvasCallback = true; try { canvas.renderField(stereo_mode); } catch (RuntimeException e) { System.err.println("Exception occurred during Canvas3D callback:"); e.printStackTrace(); } catch (Error e) { // Issue 264 - catch Error so Renderer doesn't die System.err.println("Error occurred during Canvas3D callback:"); e.printStackTrace(); } canvas.view.inCanvasCallback = false; if ((VirtualUniverse.mc.doDsiRenderLock) && (!canvas.drawingSurfaceObject.renderLock())) { if ((offBufRetained != null) && offBufRetained.isByReference()) { offBufRetained.geomLock.unLock(); } canvas.offScreenRendering = false; break doneRender; } // render transparent geometry renderBin.renderTransparent(canvas); if (doAccum) canvas.accum(canvas.ctx, accumValue); } if (doAccum) canvas.accumReturn(canvas.ctx); if (useStereo) { stereo_mode = Canvas3D.FIELD_RIGHT; canvas.rightStereoPass = true; } } canvas.imageReady = true; canvas.rightStereoPass = false; // reset renderMode canvas.setRenderMode(canvas.ctx,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -