⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 renderbin.java

📁 JAVA3D矩陈的相关类
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	    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 + -