46 lines
1.1 KiB
C++
46 lines
1.1 KiB
C++
#include "SpriteRasterizer.h"
|
|
#include "FrameBuffer.h"
|
|
#include "../RenderData/Image.h"
|
|
#include "../RenderData/Sprite.h"
|
|
|
|
namespace Rasterizer
|
|
{
|
|
void SpriteRasterizer::DrawImage(const RenderData::Image& image, int32_t x, int32_t y)
|
|
{
|
|
DrawSprite(RenderData::Sprite(&image), x, y);
|
|
}
|
|
|
|
void SpriteRasterizer::DrawSprite(const RenderData::Sprite& sprite, int32_t x, int32_t y)
|
|
{
|
|
if (frameBuffer == nullptr || !sprite.is_valid())
|
|
{
|
|
return;
|
|
}
|
|
|
|
const int32_t minX = x < 0 ? -x : 0;
|
|
const int32_t minY = y < 0 ? -y : 0;
|
|
const int32_t maxX = x + sprite.width > frameBuffer->get_width() ? frameBuffer->get_width() - x : sprite.width;
|
|
const int32_t maxY = y + sprite.height > frameBuffer->get_height() ? frameBuffer->get_height() - y : sprite.height;
|
|
|
|
if (minX >= maxX || minY >= maxY)
|
|
{
|
|
return;
|
|
}
|
|
|
|
for (int32_t sy = minY; sy < maxY; ++sy)
|
|
{
|
|
for (int32_t sx = minX; sx < maxX; ++sx)
|
|
{
|
|
const uint32_t color = sprite.get_pixel_fast(sx, sy);
|
|
const uint8_t alpha = static_cast<uint8_t>(color & 0xFF);
|
|
if (alpha == 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
frameBuffer->set_pixel(x + sx, y + sy, color);
|
|
}
|
|
}
|
|
}
|
|
}
|