📄 renderbin.java
字号:
RenderAtomListInfo arr[] = new RenderAtomListInfo[addDlist.size()]; arr = (RenderAtomListInfo []) addDlist.toArray(arr); for (i = 0; i < arr.length; i++) { if (removeDlist.contains(arr[i])) { addDlist.remove(arr[i]); removeDlist.remove(arr[i]); } } } if (addDlist.size() > 0 || removeDlist.size() > 0) { Canvas3D canvasList[][] = view.getCanvasList(false); Canvas3D cv; ArrayList rlist = new ArrayList(5); for (i = 0; i < canvasList.length; i++) { cv = canvasList[i][0]; if (cv.useSharedCtx) { // Do this only once per renderer for this view if (!rlist.contains(cv.screen.renderer)) { rlist.add(cv.screen.renderer); updateDlistRendererResource(cv.screen.renderer); } } else { updateDlistCanvasResource(canvasList[i]); } } } if (dirtyRenderMoleculeList.size() > 0 || addDlistPerRinfo.size() > 0 || removeDlistPerRinfo.size() > 0 || displayListResourceFreeList.size() > 0 || toBeAddedTextureResourceFreeList.size() > 0 ) { Canvas3D canvasList[][] = view.getCanvasList(false); Canvas3D cv; for (i = 0; i < canvasList.length; i++) { cv = canvasList[i][0]; if (cv.useSharedCtx && (cv.screen.renderer != null)) { updateRendererResource(cv.screen.renderer); } else { updateCanvasResource(canvasList[i]); } } Integer id; size = displayListResourceFreeList.size(); for (i = 0; i < size; i++) { id = (Integer)displayListResourceFreeList.get(i); VirtualUniverse.mc.freeDisplayListId(id); } // lock list of dlist // XXXX: Instead of copying could we keep 2 arrays // and just toggle? size = dirtyRenderMoleculeList.size(); for (i = 0; i < size; i++) { rm = (RenderMolecule)dirtyRenderMoleculeList.get(i); rm.onUpdateList = 0; ra = rm.primaryRenderAtomList; while (ra != null) { dlistLockList.add(ra.geometry()); ra = ra.next; } } size = addDlistPerRinfo.size(); for (i = 0; i < size; i++) { ra = (RenderAtomListInfo)addDlistPerRinfo.get(i); if (ra.geometry() != null) { dlistLockList.add(ra.geometry()); } } } clearAllUpdateObjectState(); /* if (opaqueBin != null) { System.err.println(this + "***** Begin Dumping OpaqueBin *****"); dumpBin(opaqueBin); System.err.println("***** End Dumping OpaqueBin *****"); } */ } // Shared context case void updateDlistRendererResource(Renderer rdr) { int i; int size = 0; RenderAtomListInfo arr[]; RenderAtomListInfo ra; // XXXX: there is a possible problem in the case of multiple // renderers (i.e., multiple screens). Unless the // MasterControl sends us a separate message for each // renderer, we won't create a new display list for renderers // other than the one passed into this method. if (rdr == null) { return; } if ((size = addDlist.size()) > 0) { arr = new RenderAtomListInfo[size]; arr = (RenderAtomListInfo []) addDlist.toArray(arr); for (i = 0; i < size; i++) { ra = arr[i]; GeometryArrayRetained geo = (GeometryArrayRetained)ra.geometry(); // First time thru this renderer or the context that // it is built for no longer matches the context // used in the renderer, create a dlist sharedDList.add(ra); geo.addDlistUser(this, ra); if (((geo.resourceCreationMask & rdr.rendererBit) == 0) || (geo.getDlistTimeStamp(rdr.rendererBit) != rdr.sharedCtxTimeStamp)) { geo.resourceCreationMask |= rdr.rendererBit; dirtyList.add(ra); } } } if ((size = removeDlist.size()) > 0) { arr = new RenderAtomListInfo[size]; arr = (RenderAtomListInfo []) removeDlist.toArray(arr); for (i = 0; i < size; i++) { ra = arr[i]; sharedDList.remove(ra); GeometryArrayRetained geo = (GeometryArrayRetained)ra.geometry(); geo.removeDlistUser(this, ra); // System.err.println("========> geo.refcount = "+geo.refCount); // add this geometry's dlist to be freed if (geo.isDlistUserSetEmpty(this)) { rdr.displayListResourceFreeList.add(geo.dlistObj); geo.resourceCreationMask &= ~rdr.rendererBit; // All Dlist on all renderer have been freed, then return dlistID if (geo.resourceCreationMask == 0) { geo.freeDlistId(); } } } } if ((size = dirtyList.size()) > 0) { for (i = 0; i < size; i++) { ra = (RenderAtomListInfo)dirtyList.get(i); GeometryArrayRetained geo = (GeometryArrayRetained)ra.geometry(); if ( (geo.resourceCreationMask & rdr.rendererBit) != 0) { rdr.dirtyRenderAtomList.add(ra); } } rdr.dirtyDisplayList = true; dirtyList.clear(); } } // Non-shared context case void updateDlistCanvasResource(Canvas3D[] canvases) { int i, j; Canvas3D cv; int size = 0; RenderAtomListInfo arr[]; RenderAtomListInfo ra; // Add the newly added dlist to the sharedList if ((size = addDlist.size()) > 0) { arr = new RenderAtomListInfo[size]; arr = (RenderAtomListInfo []) addDlist.toArray(arr); for (i = 0; i <size; i++) { sharedDList.add(arr[i]); // Fix for Issue 5: add the render atom to the list of users // of its geometry for this RenderBin GeometryArrayRetained geo = (GeometryArrayRetained) arr[i].geometry(); geo.addDlistUser(this, arr[i]); } } // Remove the newly removed dlist from the sharedList if ((size = removeDlist.size()) > 0) { arr = new RenderAtomListInfo[size]; arr = (RenderAtomListInfo []) removeDlist.toArray(arr); for (i = 0; i < size; i++) { sharedDList.remove(arr[i]); // Fix for Issue 5: remove this render atom from the list of users // of its geometry for this RenderBin GeometryArrayRetained geo = (GeometryArrayRetained) arr[i].geometry(); geo.removeDlistUser(this, arr[i]); } } // add to the dirty list per canvas for (j = 0; j < canvases.length; j++) { cv = canvases[j]; if ((size = addDlist.size()) > 0) { arr = new RenderAtomListInfo[size]; arr = (RenderAtomListInfo []) addDlist.toArray(arr); for (i = 0; i <size; i++) { ra = arr[i]; GeometryArrayRetained geo = (GeometryArrayRetained) ra.geometry(); if ((cv.ctx != null) && ((geo.resourceCreationMask & cv.canvasBit) == 0) || (geo.getDlistTimeStamp(cv.canvasBit) != cv.ctxTimeStamp)) { geo.resourceCreationMask |= cv.canvasBit; dirtyList.add(ra); } } } if ((size = removeDlist.size()) > 0) { arr = new RenderAtomListInfo[size]; arr = (RenderAtomListInfo []) removeDlist.toArray(arr); for (i = 0; i < size; i++) { GeometryArrayRetained geo = (GeometryArrayRetained) arr[i].geometry(); // add this geometry's dlist to be freed if (geo.isDlistUserSetEmpty(this)) { if (cv.ctx != null) { canvases[j].displayListResourceFreeList.add(geo.dlistObj); } geo.resourceCreationMask &= ~canvases[j].canvasBit; // All Dlist on all canvases have been freed, then return dlistID if (geo.resourceCreationMask == 0) geo.freeDlistId(); } } } if ((size = dirtyList.size()) > 0) { for (i = 0; i <size; i++) { ra = (RenderAtomListInfo)dirtyList.get(i); GeometryArrayRetained geo = (GeometryArrayRetained)ra.geometry(); if ((geo.resourceCreationMask & cv.canvasBit) != 0) { cv.dirtyRenderAtomList.add(ra); } } cv.dirtyDisplayList = true; dirtyList.clear(); } } } void clearAllUpdateObjectState() { localeChanged = false; obList.clear(); rmUpdateList.clear(); ogCIOList.clear(); aBinUpdateList.clear(); sBinUpdateList.clear(); tbUpdateList.clear(); removeRenderAtomInRMList.clear(); addOpaqueBin = null; bgAddOpaqueBin = null; orderedBinsList.clear(); toBeAddedBinList.clear(); objUpdateList.clear(); raLocaleVwcBoundsUpdateList.clear(); displayListResourceFreeList.clear(); toBeAddedTextureResourceFreeList.clear(); dirtyRenderMoleculeList.clear(); dirtyReferenceGeomList.clear(); reEvaluateBg = false; reloadBgTexture = false; textureBinList.clear(); newNodeComponentList.clear(); removeNodeComponentList.clear(); dirtyNodeComponentList.clear(); reEvaluateClip = false; vpcToVworldDirty = false; offScreenMessage.clear(); addDlist.clear(); removeDlist.clear(); addDlistPerRinfo.clear(); removeDlistPerRinfo.clear(); clearDirtyOrientedRAs(); reEvaluateSortMode = false; dirtyDepthSortRenderAtom.clear(); numDirtyTinfo = 0; } void updateRendererResource(Renderer rdr) { RenderMolecule rm; TextureRetained tex; Integer texIdObj; if (rdr == null) return; // Take care of display lists per Rinfo that should be rebuilt int size = addDlistPerRinfo.size(); if (size > 0) { for (int j = 0; j < size; j++) { RenderAtomListInfo rinfo = (RenderAtomListInfo)addDlistPerRinfo.get(j); if (rinfo.renderAtom.inRenderBin()) { Object[] obj = new Object[2]; obj[0] = rinfo; obj[1] = rinfo.renderAtom.renderMolecule; rdr.dirtyDlistPerRinfoList.add(obj); } } rdr.dirtyDisplayList = true; } // Take care of display lists that should be rebuilt size = dirtyRenderMoleculeList.size(); if (size > 0) { for (int j = 0; j < size; j++) { rm =(RenderMolecule)dirtyRenderMoleculeList.get(j); rdr.dirtyRenderMoleculeList.add(rm); } rdr.dirtyDisplayList = true; } // Take care of texture that should be freed size = toBeAddedTextureResourceFreeList.size(); int id; for (int j=0; j < size; j++) { tex = (TextureRetained)toBeAddedTextureResourceFreeList.get(j); id = tex.objectId; if ((id >= rdr.textureIDResourceTable.size()) || (id <= 0) || (rdr.textureIDResourceTable.get(id) != tex)) { // tex.objectId may change by another Renderer thread, // need find original texID from searching // rdr.textureIdResourceTable id = rdr.textureIDResourceTable.indexOf(tex); if (id <= 0) { continue; } } // Since multiple renderBins (in the same screen) // can share a texture object, make sure that // we are not duplicating what has been added // by a different renderBin in the same screen if ((tex.resourceCreationMask & rdr.rendererBit) != 0) { texIdObj = new Integer(id); if (!rdr.textureIdResourceFreeList.contains(texIdObj)) { rdr.textureIdResourceFreeList.add(texIdObj); tex.resourceCreationMask &= ~rdr.rendererBit; } } } // Take care of display list that should be freed size = displayListResourceFreeList.size(); Integer displayListIDObj; for (int j=0; j <size; j++) { displayListIDObj = (Integer) displayListResourceFreeList.get(j); // It doesn't harm to free the same ID twice, the // underlying graphics library just ignore the second request rdr.displayListResourceFreeList.add(displayListIDObj); } // Take care of display list that should be freed size = removeDlistPerRinfo.size(); for (int j=0; j < size; j++) { RenderAtomListInfo ra = (RenderAtomListInfo)removeDlistPerRinfo.get(j); rdr.displayListResourceFreeList.add(new Integer(ra.renderAtom.dlistIds[ra.index])); ra.groupType = 0; ra.renderAtom.dlistIds[ra.index] = -1; } } void updateCanvasResource(Canvas3D[] canvases) { int i, j; RenderMolecule rm; TextureRetained tex; Integer texIdObj; // update dirtyRenderMoleculeList for each canvas for (i = 0; i < canvases.length; i++) { Canvas3D cv = canvases[i]; // Take care of display lists per Rinfo that should be rebuilt int size = addDlistPerRinfo.size(); if (size > 0) { for ( j = 0; j < size; j++) { RenderAtomListInfo rinfo = (RenderAtomListInfo)addDlistPerRinfo.get(j); if (rinfo.renderAtom.inRenderBin()) { Object[] obj = new Object[2]; obj[0] = rinfo; obj[1] = rinfo.renderAtom.renderMolecule; cv.dirtyDlistPerRinfoList.add(obj); } } cv.dirtyDisplayList = true; } // Take care of display lists that should be rebuilt size = dirtyRenderMoleculeList.size(); if (size > 0) { for (j = 0; j < size; j++) { rm = (RenderMolecule)dirtyRenderMoleculeList.get(j); cv.dirtyRenderMoleculeList.add(rm); } cv.dirtyDisplayList = true; } // Take care of texture that should be freed size = toBeAddedTextureResourceFreeList.size(); int id; for (j=0; j < size; j++) { tex = (TextureRetained)toBeAddedTextureResourceFreeList.get(j); id = tex.objectId; if ((id >= cv.textureIDResourceTable.size()) || (id <= 0) || (cv.textureIDResourceTable.get(id) != tex)) { // tex.objectId may change by another Renderer thread, // need find original texID from searching // rdr.textureIdResourceTable id = cv.textureIDResourceTable.indexOf(tex); if (id <= 0) { continue; } } if ((tex.resourceCreationMask & cv.canvasBit) != 0) { texIdObj = new Integer(id); cv.textureIdResourceFreeList.add(texIdObj); tex.resourceCreationMask &= ~cv.canvasBit; } } // Take care of display list that should be freed
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -