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

📄 mapsplitter.cpp

📁 使用stl技术,(还没看,是听说的)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            (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 + -