TileSet
This commit is contained in:
@ -30,6 +30,7 @@ namespace ia::iae
|
||||
{
|
||||
Map<String, Handle> ResourceManager::s_images;
|
||||
Map<String, Handle> ResourceManager::s_sounds;
|
||||
Map<String, RefPtr<TileSet>> ResourceManager::s_tileSets;
|
||||
Vector<ResourceManager::ImageResource> ResourceManager::s_imageHandles;
|
||||
|
||||
VOID ResourceManager::Initialize()
|
||||
@ -59,11 +60,12 @@ namespace ia::iae
|
||||
return result;
|
||||
}
|
||||
|
||||
Handle ResourceManager::CreateImage(IN CONST String &name, IN PCUINT8 rgbaData, IN INT32 width, IN INT32 height)
|
||||
Handle ResourceManager::CreateImage(IN CONST String &name, IN PCUINT8 rgbaData, IN INT32 width, IN INT32 height,
|
||||
IN INT32 stride)
|
||||
{
|
||||
const auto texture =
|
||||
GPUResourceManager::CreateTexture(SDL_GPU_TEXTUREUSAGE_SAMPLER | SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, width,
|
||||
height, rgbaData, SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM, true);
|
||||
const auto texture = GPUResourceManager::CreateTexture(
|
||||
SDL_GPU_TEXTUREUSAGE_SAMPLER | SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, width, height,
|
||||
(stride == -1) ? width : stride, rgbaData, SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM, true);
|
||||
s_imageHandles.pushBack(ImageResource{.OriginalWidth = width,
|
||||
.OriginalHeight = height,
|
||||
.OriginalPixelData = new UINT8[width * height * 4],
|
||||
@ -154,8 +156,8 @@ namespace ia::iae
|
||||
s_imageHandles[image].OriginalHeight, s_imageHandles[image].OriginalWidth * 4,
|
||||
nullptr, newWidth, newHeight, newWidth * 4, stbir_pixel_layout::STBIR_RGBA);
|
||||
const auto texture = GPUResourceManager::CreateTexture(
|
||||
SDL_GPU_TEXTUREUSAGE_SAMPLER | SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, newWidth, newHeight, newPixelData,
|
||||
SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM, true);
|
||||
SDL_GPU_TEXTUREUSAGE_SAMPLER | SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, newWidth, newHeight, newWidth,
|
||||
newPixelData, SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM, true);
|
||||
GPUResourceManager::DestroyTexture(s_imageHandles[image].Handle);
|
||||
s_imageHandles[image].Handle = texture;
|
||||
s_imageHandles[image].Width = newWidth;
|
||||
@ -198,6 +200,44 @@ namespace ia::iae
|
||||
for (auto &t : s_images)
|
||||
t->Value = RescaleImage(t->Value, factor);
|
||||
}
|
||||
|
||||
Handle ResourceManager::CreateTileSet(IN CONST String &name, IN Handle image, IN INT32 tileWidth,
|
||||
IN INT32 tileHeight)
|
||||
{
|
||||
Vector<Handle> tileImages;
|
||||
|
||||
const auto extent = GetImageExtent(image);
|
||||
for (INT32 y = 0; y < extent.y; y += tileHeight)
|
||||
{
|
||||
for (INT32 x = 0; x < extent.x; x += tileWidth)
|
||||
{
|
||||
const auto w = s_imageHandles[image].OriginalWidth;
|
||||
tileImages.pushBack(CreateImage(BuildString(name, "_Tile", x, y),
|
||||
&s_imageHandles[image].OriginalPixelData[(x + y * w) * 4], tileWidth,
|
||||
tileHeight, w));
|
||||
}
|
||||
}
|
||||
|
||||
return CreateTileSet(name, tileImages, tileWidth, tileHeight);
|
||||
}
|
||||
|
||||
Handle ResourceManager::CreateTileSet(IN CONST String &name, IN CONST Vector<Handle> &images, IN INT32 tileWidth,
|
||||
IN INT32 tileHeight)
|
||||
{
|
||||
auto result = MakeRefPtr<TileSet>(images, tileWidth, tileHeight);
|
||||
s_tileSets[name] = result;
|
||||
return (Handle) (result.get());
|
||||
}
|
||||
|
||||
Handle ResourceManager::GetTileSet(IN CONST String &name)
|
||||
{
|
||||
return (Handle) (s_tileSets[name].get());
|
||||
}
|
||||
|
||||
VOID ResourceManager::DestroyTileSet(IN CONST String &name)
|
||||
{
|
||||
s_tileSets[name].reset();
|
||||
}
|
||||
} // namespace ia::iae
|
||||
|
||||
namespace ia::iae
|
||||
@ -262,4 +302,25 @@ namespace ia::iae
|
||||
{
|
||||
return ResourceManager::CombineImages(images, unitWidth, unitHeight, unitCountX, unitCountY);
|
||||
}
|
||||
|
||||
Handle Engine::CreateTileSet(IN CONST String &name, IN Handle image, IN INT32 tileWidth, IN INT32 tileHeight)
|
||||
{
|
||||
return ResourceManager::CreateTileSet(name, image, tileWidth, tileHeight);
|
||||
}
|
||||
|
||||
Handle Engine::CreateTileSet(IN CONST String &name, IN CONST Vector<Handle> &images, IN INT32 tileWidth,
|
||||
IN INT32 tileHeight)
|
||||
{
|
||||
return ResourceManager::CreateTileSet(name, images, tileWidth, tileHeight);
|
||||
}
|
||||
|
||||
Handle Engine::GetTileSet(IN CONST String &name)
|
||||
{
|
||||
return ResourceManager::GetTileSet(name);
|
||||
}
|
||||
|
||||
VOID Engine::DestroyTileSet(IN CONST String &name)
|
||||
{
|
||||
ResourceManager::DestroyTileSet(name);
|
||||
}
|
||||
} // namespace ia::iae
|
||||
Reference in New Issue
Block a user