📄 textureretained.java
字号:
curh = tmph; } int startw = curw; int imageXOffset = image.tilew - curw; int imageYOffset = image.tileh - curh; for (int m = 0; m < image.numYTiles; m++) { xoffset = 0; tmpw = width; curw = startw; imageXOffset = image.tilew - curw; for (int n = 0; n < image.numXTiles; n++) { java.awt.image.Raster ras; ras = ((RenderedImage)image.getRefImage(0)).getTile(n,m); byte[] data = ((DataBufferByte)ras.getDataBuffer()).getData(); updateTextureSubImage(cv, face, level, xoffset, yoffset, format, image.getImageFormatTypeIntValue(false), imageXOffset, imageYOffset, image.tilew, curw, curh, ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY, (Object) data); xoffset += curw; imageXOffset = 0; tmpw -= curw; if (tmpw < image.tilew) curw = tmpw; else curw = image.tilew; } yoffset += curh; imageYOffset = 0; tmph -= curh; if (tmph < image.tileh) curh = tmph; else curh = image.tileh; } } } /** * update a subregion of the texture image * This method needs to take care of RenderedImage as well as * BufferedImage */ void reloadTextureSubImage(Canvas3D cv, int face, int level, ImageComponentUpdateInfo info, ImageComponentRetained image) { int x = info.x, y = info.y, width = info.width, height = info.height; //The x and y here specifies the subregion of the imageData of //the associated RenderedImage. //System.err.println("\nupdateTextureSubImage: x= " + x + " y= " + y + // " width= " + width + " height= " + height + // " format= " + format); ImageComponentRetained.ImageData imageData = image.getImageData(isUseAsRaster()); if(imageData != null) { int xoffset = x; int yoffset = y; // TODO Check this logic : If !yUp adjust yoffset if (!image.yUp) { yoffset = image.height - yoffset - height; } updateTextureSubImage(cv, face, level, xoffset, yoffset, format, image.getImageFormatTypeIntValue(false), xoffset, yoffset, image.width, width, height, image.getImageDataTypeIntValue(), imageData.get()); } else { assert false; // TODO : Dead code - need to clean up for 1.6 // System.err.println("RenderedImage subImage update"); // determine the first tile of the image float mt; int minTileX, minTileY; int rx = x; int ry = y; mt = (float)(rx) / (float)image.tilew; if (mt < 0) { minTileX = (int)(mt - 1); } else { minTileX = (int)mt; } mt = (float)(ry) / (float)image.tileh; if (mt < 0) { minTileY = (int)(mt - 1); } else { minTileY = (int)mt; } // determine the pixel offset of the upper-left corner of the // first tile int startXTile = minTileX * image.tilew; int startYTile = minTileY * image.tilew; // image dimension in the first tile int curw = (startXTile + image.tilew - rx); int curh = (startYTile + image.tileh - ry); // check if the to-be-copied region is less than the tile image // if so, update the to-be-copied dimension of this tile if (curw > width) { curw = width; } if (curh > height) { curh = height; } // save the to-be-copied width of the left most tile int startw = curw; // temporary variable for dimension of the to-be-copied region int tmpw = width; int tmph = height; // offset of the first pixel of the tile to be copied; offset is // relative to the upper left corner of the title int imgX = rx - startXTile; int imgY = ry - startYTile; // determine the number of tiles in each direction that the // image spans int numXTiles = (width + imgX) / image.tilew; int numYTiles = (height + imgY) / image.tileh; if (((float)(width + imgX ) % (float)image.tilew) > 0) { numXTiles += 1; } if (((float)(height + imgY ) % (float)image.tileh) > 0) { numYTiles += 1; } java.awt.image.Raster ras; int textureX = x; // x offset in the texture int textureY = y; // y offset in the texture for (int yTile = minTileY; yTile < minTileY + numYTiles; yTile++) { tmpw = width; curw = startw; imgX = rx - startXTile; for (int xTile = minTileX; xTile < minTileX + numXTiles; xTile++) { ras = ((RenderedImage)image.getRefImage(0)).getTile(xTile, yTile); byte[] data = ((DataBufferByte)ras.getDataBuffer()).getData(); updateTextureSubImage(cv, face, level, textureX, textureY, format, image.getImageFormatTypeIntValue(false), imgX, imgY, image.tilew, curw, curh, ImageComponentRetained.IMAGE_DATA_TYPE_BYTE_ARRAY, (Object)data); // move to the next tile in x direction textureX += curw; imgX = 0; // determine the width of copy region of the next tile tmpw -= curw; if (tmpw < image.tilew) { curw = tmpw; } else { curw = image.tilew; } } // move to the next set of tiles in y direction textureY += curh; imgY = 0; // determine the height of copy region for the next set // of tiles tmph -= curh; if (tmph < image.tileh) { curh = tmph; } else { curh = image.tileh; } } } } // reload texture mipmap void reloadTexture(Canvas3D cv) { int blevel, mlevel; //System.err.println("reloadTexture: baseLevel= " + baseLevel + // " maximumLevel= " + maximumLevel); if ((cv.textureExtendedFeatures & Canvas3D.TEXTURE_LOD_RANGE) == 0 ) { blevel = 0; mlevel = maxLevels - 1; } else { blevel = baseLevel; mlevel = maximumLevel; } if (blevel != 0) { // level 0 is not the base level, hence, need // to load level 0 explicitly with a null pointer in order // for mipmapping to be active. updateTextureDimensions(cv); } for (int j = 0; j < numFaces; j++) { for (int i = blevel; i <= mlevel; i++) { // it is possible to have null pointer if only a subset // of mipmap levels is defined but the canvas does not // support lod_range extension ImageComponentRetained image = images[j][i]; if (image != null) { // Issue 366: call evaluateExtensions, since it may not // have been called yet in all cases image.evaluateExtensions(cv); reloadTextureImage(cv, j, i, image, maxLevels); } } } } // update texture mipmap based on the imageUpdateInfo void updateTexture(Canvas3D cv, int resourceBit) { //System.err.println("updateTexture\n"); ImageComponentUpdateInfo info; for (int k = 0; k < numFaces; k++) { for (int i = baseLevel; i <= maximumLevel; i++) { if (imageUpdateInfo[k][i] != null) { for (int j = 0; j < imageUpdateInfo[k][i].size(); j++) { info = (ImageComponentUpdateInfo) imageUpdateInfo[k][i].get(j); synchronized(resourceLock) { // if this info is updated, move on to the next one if ((info.updateMask & resourceBit) == 0) continue; // check if all canvases have processed this update info.updateMask &= ~resourceBit; // all the current resources have updated this // info, so this info can be removed from the // update list if ((info.updateMask & resourceCreationMask) == 0) { info.updateMask = 0; // mark this update as // done // mark the prune flag so as to prune the // update list next time when the update // list is to be modified. // Don't want to clean up the list at // rendering time because (1) MT issue, // other renderer could be processing // the update list now; // (2) takes up rendering time. if (imageUpdatePruneMask == null) { imageUpdatePruneMask = new int[numFaces]; } imageUpdatePruneMask[k] = 1 << i; } } if (info.entireImage == true) { reloadTextureImage(cv, k, i, images[k][i], maxLevels); } else { reloadTextureSubImage(cv, k, i, info, images[k][i]); } } } } } } /** * reloadTextureSharedContext is called to reload texture * on a shared context. It is invoked from the Renderer * before traversing the RenderBin. The idea is to reload * all necessary textures up front for all shared contexts * in order to minimize the context switching overhead. */ void reloadTextureSharedContext(Canvas3D cv) { // if texture is not enabled, don't bother downloading the // the texture state if (!isEnabled(cv)) { return; } bindTexture(cv); // reload all levels of texture image // update texture parameters such as boundary modes, filtering updateTextureFields(cv); // update texture Lod parameters updateTextureLOD(cv); // update all texture images reloadTexture(cv); synchronized(resourceLock) { resourceCreationMask |= cv.screen.renderer.rendererBit; resourceUpdatedMask |= cv.screen.renderer.rendererBit; resourceLodUpdatedMask |= cv.screen.renderer.rendererBit; resourceInReloadList &= ~cv.screen.renderer.rendererBit; } } /** * updateNative is called while traversing the RenderBin to * update the texture state */ void updateNative(Canvas3D cv) { boolean reloadTexture = false; // true - reload all levels of texture boolean updateTexture = false; // true - update a portion of texture boolean updateTextureLod = false; // true - update texture Lod info //System.err.println("Texture/updateNative: " + this + "object= " + objectId + " enable= " + enable); bindTexture(cv); // if texture is not enabled, don't bother downloading the // the texture state if (!isEnabled(cv)) { return; } if (cv.useSharedCtx && cv.screen.renderer.sharedCtx != null) { if ((resourceCreationMask & cv.screen.renderer.rendererBit) == 0) { reloadTexture = true; } else { if (((resourceUpdatedMask & cv.screen.renderer.rendererBit) == 0) && (imageUpdateInfo != null)) { updateTexture = true; } if ((resourceLodUpdatedMask & cv.screen.renderer.rendererBit) == 0) { updateTextureLod = true; } } if (reloadTexture || updateTexture || updateTextureLod) { cv.makeCtxCurrent(cv.screen.renderer.sharedCtx); bindTexture(cv); } } else { if ((resourceCreationMask & cv.canvasBit) == 0) { reloadTexture = true; } else { if (((resourceUpdatedMask & cv.canvasBit) == 0) && (imageUpdateInfo != null)) { updateTexture = true; } if ((resourceLodUpdatedMask & cv.canvasBit) == 0) { updateTextureLod = true; } } } if (VirtualUniverse.mc.isD3D()) { if (texTimestamp != VirtualUniverse.mc.resendTexTimestamp) { texTimestamp = VirtualUniverse.mc.resendTexTimestamp; reloadTexture = true; } if (!reloadTexture) { // D3D didn't store texture properties during Texture binding updateTextureFields(cv); } }//System.err.println("......... reloadTexture= " + reloadTexture +// " updateTexture= " + updateTexture + // " updateTextureLod= " + updateTextureLod);//System.err.println("......... resourceCreationMask= " + resourceCreationMask +// " resourceUpdatedMask= " + resourceUpdatedMask);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -