void CTileHandler::ProcessTiles2(void) { unsigned char* data=new unsigned char[1024*1024*4]; bigTex=CBitmap(data,1,1); //free big tex memory int tilex=xsize/4; int tiley=ysize/4; int bigx=tilex/32; int bigy=tiley/32; int a=0; for(int a=0;a<bigx*bigy;++a){ int startTilex=(a%bigx)*32; int startTiley=(a/bigx)*32; #ifdef WIN32 DDSURFACEDESC2 ddsheader; int ddssignature; char name[100]; sprintf(name,"Temp%03i.dds",a); CFileHandler file(name); file.Read(&ddssignature, sizeof(int)); file.Read(&ddsheader, sizeof(DDSURFACEDESC2)); #else char name[100]; snprintf(name, 100, "temp/Temp%03i.bmp.raw", a); CFileHandler file(name); #endif char bigtile[696320]; //1024x1024 and 4 mipmaps file.Read(bigtile, 696320); for(int b=0;b<1024;++b){ int x=b%32; int y=b/32; int xb=startTilex+x; //curr pointer to tile in bigtex int yb=startTiley+y; char* ctile=new char[SMALL_TILE_SIZE]; ReadTile(x*32,y*32,ctile,bigtile); CBitmap* bm=new CBitmap(); bm->CreateFromDXT1((unsigned char*)ctile,32,32); int t1=tileUse[max(0,(yb-1)*tilex+xb)]; int t2=tileUse[max(0,yb*tilex+xb-1)]; int ct=FindCloseTile(bm,t1==t2?t1:-1); if(ct==-1){ tileUse[yb*tilex+xb]=usedTiles; tiles[usedTiles++]=bm; newTiles.push_back(ctile); } else { tileUse[yb*tilex+xb]=ct; delete bm; delete[] ctile; } } printf("Creating tiles %i/%i %i%%\n", usedTiles-numExternalTile,(a+1)*1024,(((a+1)*1024)*100)/(tilex*tiley)); } delete[] data; #ifdef WIN32 system("del /q temp*.dds"); #else system("rm temp/Temp*.bmp.raw"); #endif }
void CTileHandler::ProcessTiles2(void) { unsigned char* data=new unsigned char[1024*1024*4]; bigTex=CBitmap(data,1,1); //free big tex memory int tilex=xsize/4; int tiley=ysize/4; for(int a=0;a<(tilex*tiley)/1024;++a){ int startTile=a*1024; DDSURFACEDESC2 ddsheader; int ddssignature; char name[100]; sprintf(name,"Temp%03i.dds",a); CFileHandler file(name); file.Read(&ddssignature, sizeof(int)); file.Read(&ddsheader, sizeof(DDSURFACEDESC2)); char bigtile[696320]; //1024x1024 and 4 mipmaps file.Read(bigtile, 696320); for(int b=0;b<1024;++b){ int x=b%32; int y=b/32; int xb=(startTile+b)%tilex; int yb=(startTile+b)/tilex; char* ctile=new char[SMALL_TILE_SIZE]; ReadTile(x*32,y*32,ctile,bigtile); CBitmap* bm=new CBitmap(); bm->CreateFromDXT1((unsigned char*)ctile,32,32); int t1=tileUse[max(0,(yb-1)*tilex+xb)]; int t2=tileUse[max(0,yb*tilex+xb-1)]; int ct=FindCloseTile(bm,t1==t2?t1:-1); if(ct==-1){ tileUse[yb*tilex+xb]=usedTiles; tiles[usedTiles++]=bm; newTiles.push_back(ctile); } else { tileUse[yb*tilex+xb]=ct; delete bm; delete[] ctile; } } printf("Creating tiles %i/%i %i%%\n", usedTiles-numExternalTile,(a+1)*1024,(((a+1)*1024)*100)/(tilex*tiley)); } delete[] data; system("del temp*.dds"); /* char execstring[512]; sprintf(execstring, "nvdxt.exe -file temp\\*.bmp -dxt1c -dither"); for(int a=0;a<(usedTiles-numExternalTile+1023)/1024;++a){ int startTile=numExternalTile+a*1024; for(int b=0;b<1024 && startTile+b<usedTiles;++b){ int x=b%32; int y=b/32; for(int y2=0;y2<32;++y2){ for(int x2=0;x2<32;++x2){ data[((y*32+y2)*1024+x*32+x2)*4+0]=tiles[startTile+b]->mem[((y2)*32+x2)*4+0]; data[((y*32+y2)*1024+x*32+x2)*4+1]=tiles[startTile+b]->mem[((y2)*32+x2)*4+1]; data[((y*32+y2)*1024+x*32+x2)*4+2]=tiles[startTile+b]->mem[((y2)*32+x2)*4+2]; data[((y*32+y2)*1024+x*32+x2)*4+3]=tiles[startTile+b]->mem[((y2)*32+x2)*4+3]; } } } CBitmap square(data,1024,1024); char name[100]; sprintf(name,"temp\\Temp%03i.bmp",a); square.Save(name); printf("Writing bmp files %i%%\n", ((a*1024)*100)/(usedTiles)); } printf("Creating dds files\n"); system(execstring); system("del temp\\temp*.bmp"); */ }