Commit 21c0a3c4 authored by Andrey Filippov's avatar Andrey Filippov
Browse files

generating multi-leaf tile surfaces

parent eabd962e
Loading
Loading
Loading
Loading
+211 −75
Original line number Diff line number Diff line
@@ -449,7 +449,7 @@ public class TileSurface {
			double [] wnd = new double [size * size];
			int indx = 0;
			for (int i = 0; i < size; i++){
				for (int j = 0; i < size; i++){
				for (int j = 0; j < size; j++){
					wnd[indx++] = wnd1d[i]*wnd1d[j];
				}
			}
@@ -953,13 +953,6 @@ public class TileSurface {
								int stileY = nsTile / stilesX;  
								int stileX = nsTile % stilesX;
								for (int np = 0; np < planes[nsTile].length; np++) if (planes[nsTile][np] != null){
/*									
									int surf_number =  getTileSurfaceNumber ( // maximal number of surfaces in this supertile
											nsTile, // int nsTile,
											-1, // int dir,              // direction, or -1 (same)
											np, // 0, // int np,
											planes); // TilePlanes.PlaneData [][] planes)
*/
									int [][][] src_mesh = lappingMeshes[nsTile][np];
									double [][] disp_strength = fusedSupertilePlanes[nsTile][np];
									TileData [] dual_mesh = new TileData [len2]; // full overlapping dual-sized mesh
@@ -967,28 +960,6 @@ public class TileSurface {
										System.out.println("createTileShells():2, *** NULL here***  nsTile = "+nsTile+" np="+np);
										continue;
									}
/*									
									int [] sNeibs = planes[nsTile][np].getNeibBest();
									int [] surface_numbers = new int [8];
									for (int dir = 0; dir < 8; dir++){
										int nsTile1 = getNStileDir(nsTile, dir);
										if (sNeibs[dir] >= 0){
											surface_numbers[dir] = getTileSurfaceNumber ( // maximal number of surfaces in this supertile
													nsTile1,  // int nsTile,
													-1, // int dir,              // direction, or -1 (same)
													sNeibs[dir], // int np,
													planes);
										} else if (nsTile1 >= 0){
											surface_numbers[dir] = getTileSurfaceNumber ( // maximal number of surfaces in this supertile
													nsTile1, // int nsTile,
													((dir + 4) % 8), // int dir,              // direction, or -1 (same)
													np, // 0, // int np,
													planes);
										} else { // out of the picture
											surface_numbers[dir] = -1; // out of the picture
										}
									}
*/									
									for (int indx = 0 ; indx < len2; indx++){
										 // src_mesh non-null elements can only be generated by this supertile, while
										 // neighbor links can point to others (connected).
@@ -1001,32 +972,12 @@ public class TileSurface {
											if (src_neibs != null){
												int tsegm = tileNeibs.getSegment(indx);
												int nsTile0 = getNStileDir(nsTile, tsegm);  // supertile over which this tile is
//												if (    (tsegm < 0)                    || // own tile (center square)
//														(surface_numbers[tsegm] >= 0)) { // <0 - out of picture area
												if (    (tsegm < 0)    || // own tile (center square)
														(nsTile0 >= 0)) { // <0 - out of picture area
													dual_mesh[indx] = new TileData( // now sets neighbors to -1
															disp_strength[0][indx],  // disparity
															disp_strength[1][indx]); // strength
													dual_mesh[indx].setDbgNsTile(nsTile);
/*													
													if (tsegm < 0) { // own (center)
														dual_mesh[indx].setIndex(surf_number);
													} else {
//														dual_mesh[indx].setIndex(surface_numbers[tsegm]);
														// the cell is generated byh this supertile, so if the segment is outside 
														// of the home area (tsegm >= 0), surface will be numbered as destinatination
														// supertile coming from this
//														int nsTile2 = getNStileDir(nsTile, tsegm);  // negative segm 1 is OK ?
														int dir1from2 = getDirToStile(nsTile0, nsTile); // can be -1;
														int surf = getTileSurfaceNumber ( // maximal number of surfaces in this supertile
																nsTile0,  // int nsTile,
																dir1from2, // int dir,              // direction, or -1 (same)
																np, // int np,
																planes); 
														dual_mesh[indx].setIndex(surf);
													}
*/
													int dirThisfrom0 = getDirToStile(nsTile0, nsTile); // can be -1;
													int surf0 = getTileSurfaceNumber ( // Number of the surface for the tile itself
															nsTile0,      // int nsTile,
@@ -1048,7 +999,6 @@ public class TileSurface {
															// nsTile2 - non-overlapping supertile where the destination tile belongs
															// Unique surface number should be determined for nsTile2, generated by nsTile1,
															// for direction how nsTile1 is visible from the nsTile2
//															int dir1from2 = getDirToStile(nsTile2, nsTile1); // can be -1;
															int dir1from2 = getDirToStile(nsTile2, nsTile1); // can be -1;
															int surf = getTileSurfaceNumber ( // maximal number of surfaces in this supertile
																	nsTile2,  // int nsTile,
@@ -1064,38 +1014,16 @@ public class TileSurface {
									}
									// Now we have a double-sized surface with all tiles set with correct absolute indices, now just split it
									//surf_number =
									int sh3 = 3 * sh;
									for (int ty = 0; ty < ss2; ty++ ){
										for (int tx = 0; tx < ss2; tx++ ){
											int indx = ty * ss2 + tx;
											if (dual_mesh[indx] != null) { // some cells may be missing after merge
												int tsegm = tileNeibs.getSegment(indx);
//												int nsTile1 = getNStileDir(nsTile,tsegm);
												int ix, iy;
												/*
												switch (tsegm){
												case -1 : ix = tx - sh ; iy = ty - sh ; break;
												case  0 : ix = tx - sh ; iy = ty + sh ; break;
												case  1 : ix = tx - sh3; iy = ty + sh ; break;
												case  2 : ix = tx - sh3; iy = ty - sh ; break;
												case  3 : ix = tx - sh3; iy = ty + sh3; break;
												case  4 : ix = tx - sh ; iy = ty + sh3; break;
												case  5 : ix = tx + sh ; iy = ty + sh3; break;
												case  6 : ix = tx + sh ; iy = ty - sh ; break;
												case  7 : ix = tx + sh ; iy = ty + sh ; break;
												default:
													ix = tx -sh; iy = ty -sh;
												}
												*/
												ix = (stileX * superTileSize) + tx -sh; iy = (stileY * superTileSize) + ty -sh;

//												if ((ix >= 0) && (ix < superTileSize) && (iy >= 0) && (iy < superTileSize)) {
//												int tindx = ((stileY * superTileSize) + iy) * tilesX + ((stileX * superTileSize) + ix); 
												if ((ix >= 0) && (ix < tilesX) && (iy >= 0) && (iy < tilesX)) {
													int tindx = iy * tilesX + ix;
//													if ()
													tile_data[tindx][dual_mesh[indx].getIndex()] = dual_mesh[indx]; //oob
													//	tile_data[nsTile1][iy * superTileSize + ix][dual_mesh[indx].getIndex()] = dual_mesh[indx]; 
												}
											}
										}
@@ -1222,6 +1150,195 @@ public class TileSurface {
			return tile_data;
		}

	
		public void  checkShellsConnections (
				final TileData [][]     tileData,
				final int               debugLevel,
				final int               dbg_X,
				final int               dbg_Y)
		{
			final int nStiles = stilesX * stilesY; 
			final int nTiles =  nStiles * superTileSize * superTileSize; 
//			final TileData [][] tile_data = new TileData [nTiles][];
			final Thread[] threads = ImageDtt.newThreadArray(threadsMax);
			final AtomicInteger ai = new AtomicInteger(0);
			final int dbg_stile = (dbg_Y * superTileSize) * (stilesX * superTileSize) + (dbg_X * superTileSize);
//			final int dbg_tile = dbg_Y * stilesX + dbg_X;
			final int dbg_tilesX = stilesX * superTileSize;
			for (int ithread = 0; ithread < threads.length; ithread++) {
				threads[ithread] = new Thread() {
					public void run() {
						for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) {
							
							int dbg_stX = nTile % dbg_tilesX;   
							int dbg_stY = nTile / dbg_tilesX;
							int dbg_st = (dbg_stY / superTileSize) * stilesX + (dbg_stX / superTileSize);
							int dl = ((debugLevel > -1) && (dbg_st == dbg_stile)) ? 3:0;
							if (dl > 0){
								System.out.println("checkShellsConnections(), nTile = "+nTile+ ", nsTile = "+dbg_st);
							}
							if (tileData[nTile] != null){
								for (int nl = 0; nl < tileData[nTile].length; nl++){
									if (tileData[nTile][nl] != null){
										int  [] neibs = tileData[nTile][nl].getNeighbors();
										for (int dir = 0; dir < neibs.length; dir++){
											if (neibs[dir] >= 0){
												int nTile1 = getNtileDir(nTile, dir);
												if (nTile1 >= 0) {
													if ((tileData[nTile1] == null) || (tileData[nTile1][neibs[dir]] == null)){
														if (debugLevel > -1) {
															int dbg_sstile = tileData[nTile][nl].getDbgNsTile();
															int dbg_stileX = dbg_sstile % stilesX; 
															int dbg_stileY = dbg_sstile / stilesX;
															int dbg_tx = nTile % dbg_tilesX;
															int dbg_ty = nTile / dbg_tilesX;
															int dbg_dx = dbg_tx - (superTileSize * dbg_stileX + superTileSize/2); 
															int dbg_dy = dbg_ty - (superTileSize * dbg_stileY + superTileSize/2); 

															System.out.println("Broken link: "+nTile1+ " from "+nTile+", nl="+nl+", dir = "+dir+
																	", dbg_stX="+dbg_stX+", dbg_stY="+dbg_stY+", dbg_st="+dbg_st+", neibs[dir]="+neibs[dir]+
																	" dbg_nsTile = "+dbg_sstile +" ("+dbg_stileX+":"+dbg_stileY+")"+
																	" nTile="+nTile+" ("+dbg_tx+":"+dbg_ty+")"+
																	", deltas from src center: "+dbg_dx+":"+dbg_dy);
														}
														neibs[dir] = -2; // was broken link
													} else { // check if link is mutual
														int [] neibs_other = tileData[nTile1][neibs[dir]].getNeighbors();
														if (neibs_other[(dir + 4) % 8] != nl){
															if (debugLevel > -1) {
																int dbg_sstile = tileData[nTile][nl].getDbgNsTile();
																int dbg_stileX = dbg_sstile % stilesX; 
																int dbg_stileY = dbg_sstile / stilesX;
																int dbg_tx = nTile % dbg_tilesX;
																int dbg_ty = nTile / dbg_tilesX;
																int dbg_dx = dbg_tx - (superTileSize * dbg_stileX + superTileSize/2); 
																int dbg_dy = dbg_ty - (superTileSize * dbg_stileY + superTileSize/2); 

																System.out.println("Link not mutual: "+nTile1+ " from "+nTile+", nl="+nl+", dir = "+dir+
																		", dbg_stX="+dbg_stX+", dbg_stY="+dbg_stY+", dbg_st="+dbg_st+", neibs[dir]="+neibs[dir]+
																		" dbg_nsTile = "+dbg_sstile +" ("+dbg_stileX+":"+dbg_stileY+")"+
																		" nTile="+nTile+" ("+dbg_tx+":"+dbg_ty+")"+
																		", deltas from src center: "+dbg_dx+":"+dbg_dy+
																		", neibs_other["+((dir + 4) % 8)+"]="+neibs_other[(dir + 4) % 8]+
																		", dbg_nsTile other="+tileData[nTile1][neibs[dir]].getDbgNsTile());
															}
															neibs[dir] = -3; // not a mutual link (break only this side here)
														}
													}
												}
											}
										}
									}
								}
							}			
						}
					}
				};
			}		      
			ImageDtt.startAndJoin(threads);
		}		
		
		public void  addBackShellsConnections (
				final TileData [][]     tileData,
				final int               debugLevel,
				final int               dbg_X,
				final int               dbg_Y)
		{
			final int nStiles = stilesX * stilesY; 
			final int nTiles =  nStiles * superTileSize * superTileSize; 
//			final TileData [][] tile_data = new TileData [nTiles][];
			final Thread[] threads = ImageDtt.newThreadArray(threadsMax);
			final AtomicInteger ai = new AtomicInteger(0);
			final int dbg_stile = (dbg_Y * superTileSize) * (stilesX * superTileSize) + (dbg_X * superTileSize);
//			final int dbg_tile = dbg_Y * stilesX + dbg_X;
			final int dbg_tilesX = stilesX * superTileSize;
			for (int ithread = 0; ithread < threads.length; ithread++) {
				threads[ithread] = new Thread() {
					public void run() {
						for (int nTile = ai.getAndIncrement(); nTile < nTiles; nTile = ai.getAndIncrement()) {
							
							int dbg_stX = nTile % dbg_tilesX;   
							int dbg_stY = nTile / dbg_tilesX;
							int dbg_st = (dbg_stY / superTileSize) * stilesX + (dbg_stX / superTileSize);
							int dl = ((debugLevel > -1) && (dbg_st == dbg_stile)) ? 3:0;
							if (dl > 0){
								System.out.println("checkShellsConnections(), nTile = "+nTile+ ", nsTile = "+dbg_st);
							}
							if (tileData[nTile] != null){
								for (int nl = 0; nl < tileData[nTile].length; nl++){
									if (tileData[nTile][nl] != null){
										int  [] neibs = tileData[nTile][nl].getNeighbors();
										for (int dir = 0; dir < neibs.length; dir++){
											if (neibs[dir] >= 0){
												int nTile1 = getNtileDir(nTile, dir);
												if (nTile1 >= 0) {
													if ((tileData[nTile1] == null) || (tileData[nTile1][neibs[dir]] == null)){
														if (debugLevel > 0) {
															int dbg_sstile = tileData[nTile][nl].getDbgNsTile();
															int dbg_stileX = dbg_sstile % stilesX; 
															int dbg_stileY = dbg_sstile / stilesX;
															int dbg_tx = nTile % dbg_tilesX;
															int dbg_ty = nTile / dbg_tilesX;
															int dbg_dx = dbg_tx - (superTileSize * dbg_stileX + superTileSize/2); 
															int dbg_dy = dbg_ty - (superTileSize * dbg_stileY + superTileSize/2); 

															System.out.println("Broken link: "+nTile1+ " from "+nTile+", nl="+nl+", dir = "+dir+
																	", dbg_stX="+dbg_stX+", dbg_stY="+dbg_stY+", dbg_st="+dbg_st+", neibs[dir]="+neibs[dir]+
																	" dbg_nsTile = "+dbg_sstile +" ("+dbg_stileX+":"+dbg_stileY+")"+
																	" nTile="+nTile+" ("+dbg_tx+":"+dbg_ty+")"+
																	", deltas from src center: "+dbg_dx+":"+dbg_dy);
														}
//														neibs[dir] = -2; // was broken link
													} else { // check if link is mutual
														int [] neibs_other = tileData[nTile1][neibs[dir]].getNeighbors();
														if (neibs_other[(dir + 4) % 8] != nl){
															if (debugLevel > 0) {
																int dbg_sstile = tileData[nTile][nl].getDbgNsTile();
																int dbg_stileX = dbg_sstile % stilesX; 
																int dbg_stileY = dbg_sstile / stilesX;
																int dbg_tx = nTile % dbg_tilesX;
																int dbg_ty = nTile / dbg_tilesX;
																int dbg_dx = dbg_tx - (superTileSize * dbg_stileX + superTileSize/2); 
																int dbg_dy = dbg_ty - (superTileSize * dbg_stileY + superTileSize/2); 

																System.out.println("Link not mutual: "+nTile1+ " from "+nTile+", nl="+nl+", dir = "+dir+
																		", dbg_stX="+dbg_stX+", dbg_stY="+dbg_stY+", dbg_st="+dbg_st+", neibs[dir]="+neibs[dir]+
																		" dbg_nsTile = "+dbg_sstile +" ("+dbg_stileX+":"+dbg_stileY+")"+
																		" nTile="+nTile+" ("+dbg_tx+":"+dbg_ty+")"+
																		", deltas from src center: "+dbg_dx+":"+dbg_dy+
																		", neibs_other["+((dir + 4) % 8)+"]="+neibs_other[(dir + 4) % 8]+
																		", dbg_nsTile other="+tileData[nTile1][neibs[dir]].getDbgNsTile());
															}
															if (neibs_other[(dir + 4) % 8] < 0 ){
																neibs_other[(dir + 4) % 8] = nl; // adding back link instead of missing one
															} else {
																int nTile2 = getNtileDir(nTile1, (dir + 4) % 8);
																if (    (nTile2 < 0) ||
																		(tileData[nTile2] == null) ||
																		(tileData[nTile2][neibs_other[(dir + 4) % 8]] == null)) {
																	neibs_other[(dir + 4) % 8] = nl; // adding back link instead of broken one
																}
															}
														}
													}
												}
											}
										}
									}
								}
							}			
						}
					}
				};
			}		      
			ImageDtt.startAndJoin(threads);
		}		

		
		
		
		
		
		public int getTileLayersNumber (
				final TileData [][] tileData)
		{
@@ -1279,7 +1396,6 @@ public class TileSurface {
			final Thread[] threads = ImageDtt.newThreadArray(threadsMax);
			final AtomicInteger ai = new AtomicInteger(0);
			final int numLayers = getTileLayersNumber(tileData);
//			final double [][][] disp_strength = new double [numLayers][2][tileData.length];
			final int [][][] connections = new int [numLayers][tileData.length][8];
			for (int ithread = 0; ithread < threads.length; ithread++) {
				threads[ithread] = new Thread() {
@@ -1351,7 +1467,27 @@ public class TileSurface {
					debugLevel,        // final int                       debugLevel,
					dbg_X,             // final int                       dbg_X,
					dbg_Y);            // final int                       dbg_Y);

			System.out.println("addBackShellsConnections()");
			addBackShellsConnections (
					tileData,          // final TileData [][]     tileData_src,
					debugLevel,        // final int                       debugLevel,
					dbg_X,             // final int                       dbg_X,
					dbg_Y);            // final int                       dbg_Y);
//			
			System.out.println("checkShellsConnections()");
			checkShellsConnections (
					tileData,          // final TileData [][]     tileData_src,
					debugLevel,        // final int                       debugLevel,
					dbg_X,             // final int                       dbg_X,
					dbg_Y);            // final int                       dbg_Y);
/*			
			System.out.println("checkShellsConnections() - 2");
			checkShellsConnections (
					tileData,          // final TileData [][]     tileData_src,
					debugLevel,        // final int                       debugLevel,
					dbg_X,             // final int                       dbg_X,
					dbg_Y);            // final int                       dbg_Y);
*/
			tileData = compactSortShells (
					tileData,          // final TileData [][]     tileData_src,
					debugLevel,        // final int                       debugLevel,