📄 mapsplitter.cpp
字号:
(uint) mCurrentMap->getHeight(),
(uint) mCurrentMap->getNumElemBytes(mCurrentMap->getFormat ()));
}
//-----------------------------------------------------------------------
void MapSplitter::BlitSubImage (uchar *BaseData, uchar *OutData,
uint x, uint y,
uint tile_width, uint tile_height,
uint tile_width_copy, uint tile_height_copy,
uint base_width,
uint bpp)
{
uchar *src, *dest;
uint dest_shift = bpp*tile_width;
uint dest_shift_copy = bpp*tile_width_copy;
uint src_shift = bpp*base_width;
src = BaseData + y*src_shift + bpp*x;
dest = OutData;
for (uint j = 0; j < tile_height_copy; j++)
{
memcpy (dest, src, dest_shift_copy);
dest += dest_shift;
src = src + src_shift;
}
}
//-----------------------------------------------------------------------
void MapSplitter::SplitAndSpaceCurrentMap(String filename, int tile_spacing,
int tile_size)
{
uchar *BaseData = mCurrentMap->getData();
uint base_image_width = mCurrentMap->getWidth ();
uint base_image_height = mCurrentMap->getHeight ();
uint base_image_bypp = mCurrentMap->getNumElemBytes (mCurrentMap->getFormat ());
DEBUG_PROGRESS_OUTPUT ( "Width : " << base_image_width);
DEBUG_PROGRESS_OUTPUT (" Height : " << base_image_height);
DEBUG_PROGRESS_OUTPUT (" Bypp : " << base_image_bypp);
std::cout << filename << "\n";
String file_name;
String pure_file_name;
// Get codec according to filename extension
std::vector< String > partofname = StringUtil::split (filename, ".");
String ext_name;
if (partofname.size() == 0)
{
ext_name = PagingLandScapeOptions::getSingleton().landscape_extension;
pure_file_name = filename;
}
else
{
ext_name = partofname[partofname.size() - 1];
for (uint i = 0; i < partofname.size() - 1; i++)
pure_file_name += partofname[i] + ".";
}
// number of tiles along width and height axis
uint height_split_count = base_image_height / (tile_size + tile_spacing);
uint width_split_count = base_image_width / (tile_size + tile_spacing);
uint size_split_count = (tile_size + tile_spacing) * (tile_size + tile_spacing);
if ((base_image_height / tile_size) == 1 &&
(base_image_width / tile_size) == 1)
{
saveCurrentMap (filename);
return;
}
uchar *SplittedData = new uchar[size_split_count*base_image_bypp];
for (uint i = 0; i < height_split_count; i++)
{
for (uint j = 0; j < width_split_count; j++)
{
// Blit copy from base image to sub-image
BlitSubImage (BaseData,
SplittedData,
j*tile_size,
i*tile_size,
tile_size + tile_spacing,
tile_size + tile_spacing,
tile_size + tile_spacing,
tile_size + tile_spacing,
base_image_width,
base_image_bypp);
// make up filename with tile indexes
String SplitFileName;
SplitFileName = pure_file_name + StringConverter::toString(i) + String(".") + StringConverter::toString(j) + String(".") + ext_name;
save (const_cast< char * > (SplitFileName.c_str()),
SplittedData,
tile_size + tile_spacing,
tile_size + tile_spacing,
base_image_bypp);
DEBUG_PROGRESS_OUTPUT ("created : " << SplitFileName << "\n");
}
}
//----last row : special treatment : read too far on bottom
for (uint j = 0; j < width_split_count; j++)
{
// just to be sure that area not copied into are blank.
memset (SplittedData, 0, size_split_count*base_image_bypp);
// Blit copy from base image to sub-image
BlitSubImage (BaseData,
SplittedData,
j*tile_size,
height_split_count * tile_size,
tile_size + tile_spacing,
tile_size + tile_spacing,
tile_size + tile_spacing,
tile_size,
base_image_width,
base_image_bypp);
// make up filename with tile indexes
String SplitFileName;
SplitFileName = pure_file_name + StringConverter::toString(height_split_count) + String(".") + StringConverter::toString(j) + String(".") + ext_name;
save (const_cast< char * > (SplitFileName.c_str()),
SplittedData,
tile_size + tile_spacing,
tile_size + tile_spacing,
base_image_bypp);
DEBUG_PROGRESS_OUTPUT ("created : " << SplitFileName << "\n");
}
//----last col : special treatment : read too far on bottom
for (uint i = 0; i < height_split_count; i++)
{
// just to be sure that area not copied into are blank.
memset (SplittedData, 0, size_split_count*base_image_bypp);
// Blit copy from base image to sub-image
BlitSubImage (BaseData,
SplittedData,
width_split_count*tile_size,
i * tile_size,
tile_size + tile_spacing,
tile_size + tile_spacing,
tile_size,
tile_size + tile_spacing,
base_image_width,
base_image_bypp);
// make up filename with tile indexes
String SplitFileName;
SplitFileName = pure_file_name + StringConverter::toString(i) + String(".") + StringConverter::toString(width_split_count) + String(".") + ext_name;
save (const_cast< char * > (SplitFileName.c_str()),
SplittedData,
tile_size + tile_spacing,
tile_size + tile_spacing,
base_image_bypp);
DEBUG_PROGRESS_OUTPUT ("created : " << SplitFileName << "\n");
}
//----last row, last col : reads too far on right and bottom
// just to be sure that area not copied into are blank.
memset (SplittedData, 0, size_split_count*base_image_bypp);
// Blit copy from base image to sub-image
BlitSubImage (BaseData,
SplittedData,
width_split_count * tile_size,
height_split_count * tile_size,
tile_size + tile_spacing,
tile_size + tile_spacing,
tile_size,
tile_size,
base_image_width,
base_image_bypp);
// make up filename with tile indexes
String SplitFileName;
SplitFileName = pure_file_name + StringConverter::toString(height_split_count) +
String(".") + StringConverter::toString(width_split_count) + String(".") + ext_name;
save (const_cast< char * > (SplitFileName.c_str()),
SplittedData,
tile_size + tile_spacing,
tile_size + tile_spacing,
base_image_bypp);
delete[] SplittedData;
DEBUG_PROGRESS_OUTPUT ("created : " << SplitFileName << "\n");
}
//-----------------------------------------------------------------------
void MapSplitter::SplitCurrentMap(String filename, int tile_size)
{
uchar *BaseData = mCurrentMap->getData();
uint base_image_width = mCurrentMap->getWidth ();
uint base_image_height = mCurrentMap->getHeight ();
uint base_image_bypp = mCurrentMap->getNumElemBytes (mCurrentMap->getFormat ());
DEBUG_PROGRESS_OUTPUT ( "Width : " << base_image_width);
DEBUG_PROGRESS_OUTPUT (" Height : " << base_image_height);
DEBUG_PROGRESS_OUTPUT (" Bpp : " << base_image_bypp);
std::cout << filename << "\n";
String file_name;
String pure_file_name;
// Get codec according to filename extension
std::vector< String > partofname = StringUtil::split (filename, ".");
String ext_name;
if (partofname.size() == 0)
{
ext_name = PagingLandScapeOptions::getSingleton().landscape_extension;
pure_file_name = filename;
}
else
{
ext_name = partofname[partofname.size() - 1];
for (uint i = 0; i < partofname.size() - 1; i++)
pure_file_name += partofname[i] + ".";
}
// number of tiles along width and height axis
int height_split_count = base_image_height / tile_size;
int width_split_count = base_image_width / tile_size;
int size_split_count = tile_size * tile_size;
if (height_split_count == 1 && width_split_count == 1)
{
saveCurrentMap (filename);
return;
}
uchar *SplittedData = new uchar[size_split_count*base_image_bypp];
for (int i = 0; i < height_split_count; i++)
{
for (int j = 0; j < width_split_count; j++)
{
// Blit copy from base image to sub-image
BlitSubImage (BaseData,
SplittedData,
j*tile_size,
i*tile_size,
tile_size,
tile_size,
tile_size,
tile_size,
base_image_width,
base_image_bypp);
// make up filename with tile indexes
String SplitFileName;
SplitFileName = pure_file_name + StringConverter::toString(i) + String(".") + StringConverter::toString(j) + String(".") + ext_name;
save (const_cast< char * > (SplitFileName.c_str()),
SplittedData,
tile_size, tile_size,
base_image_bypp);
DEBUG_PROGRESS_OUTPUT ("created : " << SplitFileName << "\n");
}
}
delete[] SplittedData;
}
}//namespace Ogre
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -