📄 graphicscontext3d.java
字号:
sendRenderMessage(false, GraphicsContext3D.SET_AURAL_ATTRIBUTES, attributes, null); } else { sendRenderMessage(true, GraphicsContext3D.SET_AURAL_ATTRIBUTES, attributes, null); } } void doSetAuralAttributes(AuralAttributes attributes) { this.auralAttributes = attributes; sendSoundMessage(GraphicsContext3D.SET_AURAL_ATTRIBUTES, attributes, null); } /** * Retrieves the current AuralAttributes component object. * @return the current AuralAttributes object */ public AuralAttributes getAuralAttributes() { return uAuralAttributes; } /** * Sets a flag that specifies whether the double buffering and * stereo mode from the Canvas3D are overridden. When set to * true, this attribute enables the * <code>frontBufferRendering</code> and <code>stereoMode</code> * attributes. * * @param bufferOverride the new buffer override flag * * @see #setFrontBufferRendering * @see #setStereoMode * * @since Java 3D 1.2 */ public void setBufferOverride(boolean bufferOverride) { uBufferOverride = bufferOverride; if ((canvas3d.view == null) || (canvas3d.view.universe == null) || (!canvas3d.view.active) || (Thread.currentThread() == canvas3d.screen.renderer)) { doSetBufferOverride(bufferOverride); } else if (Thread.currentThread() == canvas3d.view.universe.behaviorScheduler) { sendRenderMessage(false, GraphicsContext3D.SET_BUFFER_OVERRIDE, new Boolean(bufferOverride), null); } else { sendRenderMessage(true, GraphicsContext3D.SET_BUFFER_OVERRIDE, new Boolean(bufferOverride), null); } } void doSetBufferOverride(boolean bufferOverride) { if (bufferOverride != this.bufferOverride) { this.bufferOverride = bufferOverride; dirtyMask |= BUFFER_MODE; } } /** * Returns the current buffer override flag. * @return true if buffer override is enabled; otherwise, * false is returned * * @since Java 3D 1.2 */ public boolean getBufferOverride() { return uBufferOverride; } /** * Sets a flag that enables or disables immediate mode rendering * into the front buffer of a double buffered Canvas3D. * This attribute is only used when the * <code>bufferOverride</code> flag is enabled. * <p> * Note that this attribute has no effect if double buffering * is disabled or is not available on the Canvas3D. * * @param frontBufferRendering the new front buffer rendering flag * * @see #setBufferOverride * * @since Java 3D 1.2 */ public void setFrontBufferRendering(boolean frontBufferRendering) { uFrontBufferRendering = frontBufferRendering; if ((canvas3d.view == null) || (canvas3d.view.universe == null) || (!canvas3d.view.active) || (Thread.currentThread() == canvas3d.screen.renderer)) { doSetFrontBufferRendering(frontBufferRendering); } else if (Thread.currentThread() == canvas3d.view.universe.behaviorScheduler) { sendRenderMessage(false, GraphicsContext3D.SET_FRONT_BUFFER_RENDERING, new Boolean(frontBufferRendering), null); } else { sendRenderMessage(true, GraphicsContext3D.SET_FRONT_BUFFER_RENDERING, new Boolean(frontBufferRendering), null); } } void doSetFrontBufferRendering(boolean frontBufferRendering) { if (frontBufferRendering != this.frontBufferRendering) { this.frontBufferRendering = frontBufferRendering; dirtyMask |= BUFFER_MODE; } } /** * Returns the current front buffer rendering flag. * @return true if front buffer rendering is enabled; otherwise, * false is returned * * @since Java 3D 1.2 */ public boolean getFrontBufferRendering() { return uFrontBufferRendering; } /** * Sets the stereo mode for immediate mode rendering. The * parameter specifies which stereo buffer or buffers is rendered * into. This attribute is only used when the * <code>bufferOverride</code> flag is enabled. * <ul> * <li> * <code>STEREO_LEFT</code> specifies that rendering is done into * the left eye. * </li> * <li> * <code>STEREO_RIGHT</code> specifies that rendering is done into * the right eye. * </li> * <li> * <code>STEREO_BOTH</code> specifies that rendering is done into * both eyes. This is the default. * </li> * </ul> * * <p> * Note that this attribute has no effect if stereo is disabled or * is not available on the Canvas3D. * * @param stereoMode the new stereo mode * * @see #setBufferOverride * * @since Java 3D 1.2 */ public void setStereoMode(int stereoMode) { uStereoMode = stereoMode; if ((canvas3d.view == null) || (canvas3d.view.universe == null) || (!canvas3d.view.active) || (Thread.currentThread() == canvas3d.screen.renderer)) { doSetStereoMode(stereoMode); } else if (Thread.currentThread() == canvas3d.view.universe.behaviorScheduler) { sendRenderMessage(false, GraphicsContext3D.SET_STEREO_MODE, stereoModes[stereoMode], null); } else { sendRenderMessage(true, GraphicsContext3D.SET_STEREO_MODE, stereoModes[stereoMode], null); } } void doSetStereoMode(int stereoMode) { if (stereoMode != this.stereoMode) { this.stereoMode = stereoMode; dirtyMask |= BUFFER_MODE; } } /** * Returns the current stereo mode. * @return the stereo mode, one of <code>STEREO_LEFT</code>, * <code>STEREO_RIGHT</code>, or <code>STEREO_BOTH</code>. * * @since Java 3D 1.2 */ public int getStereoMode() { return uStereoMode; }//// Methods to draw graphics objects// /** * Clear the Canvas3D to the color or image specified by the * current background node. */ public void clear() { if ((canvas3d.view == null) || (canvas3d.view.universe == null) || (!canvas3d.view.active)) { return; } else if (Thread.currentThread() == canvas3d.screen.renderer) { doClear(); } else if (Thread.currentThread() == canvas3d.view.universe.behaviorScheduler) { sendRenderMessage(false, GraphicsContext3D.CLEAR, null, null); } else { sendRenderMessage(true, GraphicsContext3D.CLEAR, null, null); } } void doClear() { if (!canvas3d.firstPaintCalled) return; RenderBin rb = canvas3d.view.renderBin; BackgroundRetained back = null; if (this.background != null) back = (BackgroundRetained)this.background.retained; else back = this.black; // XXXX: This should ideally be done by the renderer (or by the // canvas itself) when the canvas is first added to a view. /* if ((canvas3d.screen.renderer != null) && (canvas3d.screen.renderer.renderBin == null)) canvas3d.screen.renderer.renderBin = rb; */ // If we are in pure immediate mode, update the view cache if (!canvas3d.isRunning) updateViewCache(rb); // We need to catch NullPointerException when the dsi // gets yanked from us during a remove. try { // 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 (!canvas3d.offScreen) { canvas3d.drawingSurfaceObject.getDrawingSurfaceObjectInfo(); } if (canvas3d.drawingSurfaceObject.renderLock()) { // XXXX : Fix texture /* if (canvas3d.useSharedCtx) { if (canvas3d.screen.renderer.sharedCtx == 0) { synchronized (VirtualUniverse.mc.contextCreationLock) { canvas3d.screen.renderer.sharedCtx = canvas3d.createNewContext( canvas3d.screen.display, canvas3d.window, 0, true, canvas3d.offScreen); canvas3d.screen.renderer.sharedCtxTimeStamp = VirtualUniverse.mc.getContextTimeStamp(); canvas3d.screen.renderer.needToRebuildDisplayList = true; } } } */ if (canvas3d.ctx == null) { synchronized (VirtualUniverse.mc.contextCreationLock) { canvas3d.ctx = canvas3d.createNewContext(null, false); if (canvas3d.ctx == null) { canvas3d.drawingSurfaceObject.unLock(); return; } canvas3d.ctxTimeStamp = VirtualUniverse.mc.getContextTimeStamp(); canvas3d.screen.renderer.listOfCtxs.add(canvas3d.ctx); canvas3d.screen.renderer.listOfCanvases.add(canvas3d); canvas3d.beginScene(); if (canvas3d.graphics2D != null) { canvas3d.graphics2D.init(); } // enable separate specular color canvas3d.enableSeparateSpecularColor(); } // create the cache texture state in canvas // for state download checking purpose if (canvas3d.texUnitState == null) { canvas3d.createTexUnitState(); } canvas3d.drawingSurfaceObject.contextValidated(); canvas3d.screen.renderer.currentCtx = canvas3d.ctx; canvas3d.screen.renderer.currentDrawable = canvas3d.drawable; initializeState(); canvas3d.ctxChanged = true; canvas3d.canvasDirty = 0xffff; // Update Appearance updateState(rb, RenderMolecule.SURFACE); canvas3d.currentLights = new LightRetained[canvas3d.getNumCtxLights(canvas3d.ctx)]; for (int j=0; j<canvas3d.currentLights.length; j++) { canvas3d.currentLights[j] = null; } } canvas3d.makeCtxCurrent(); if ((dirtyMask & BUFFER_MODE) != 0) { if (bufferOverride) { canvas3d.setRenderMode(canvas3d.ctx, stereoMode, canvas3d.useDoubleBuffer && !frontBufferRendering); } else { if (!canvas3d.isRunning) { canvas3d.setRenderMode(canvas3d.ctx, Canvas3D.FIELD_ALL, canvas3d.useDoubleBuffer); } } dirtyMask &= ~BUFFER_MODE; } Dimension size = canvas3d.getSize(); int winWidth = size.width; int winHeight = size.height; boolean isByRefBackgroundImage = false; if (back.image != null) { if (back.image.isByReference()) { back.image.geomLock.getLock(); isByRefBackgroundImage = true; } back.image.evaluateExtensions(canvas3d); } canvas3d.clear(back, winWidth, winHeight); if (isByRefBackgroundImage) { back.image.geomLock.unLock(); } // Set the viewport and view matrices if (!canvas3d.isRunning) { CanvasViewCache cvCache = canvas3d.canvasViewCache; canvas3d.setViewport(canvas3d.ctx, 0, 0, cvCache.getCanvasWidth(), cvCache.getCanvasHeight()); if (bufferOverride && (stereoMode == STEREO_RIGHT)) { canvas3d.setProjectionMatrix(canvas3d.ctx,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -