You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
4.0 KiB
131 lines
4.0 KiB
/** |
|
* @file clx_render.hpp |
|
* |
|
* CL2 rendering. |
|
*/ |
|
#pragma once |
|
|
|
#include <cstdint> |
|
#include <utility> |
|
|
|
#ifdef DEBUG_CLX |
|
#include <string> |
|
#endif |
|
|
|
#include "engine/clx_sprite.hpp" |
|
#include "engine/point.hpp" |
|
#include "engine/render/light_render.hpp" |
|
#include "engine/surface.hpp" |
|
|
|
namespace devilution { |
|
|
|
/** |
|
* @brief Apply the color swaps to a CLX sprite list; |
|
*/ |
|
void ClxApplyTrans(ClxSpriteList list, const uint8_t *trn); |
|
void ClxApplyTrans(ClxSpriteSheet sheet, const uint8_t *trn); |
|
|
|
/** |
|
* @brief Blit CL2 sprite, to the back buffer at the given coordianates |
|
* @param out Output buffer |
|
* @param position Target buffer coordinate |
|
* @param clx CLX frame |
|
* @param frame CL2 frame number |
|
*/ |
|
void ClxDraw(const Surface &out, Point position, ClxSprite clx); |
|
|
|
/** |
|
* @brief Same as ClxDraw but position.y is the top of the sprite instead of the bottom. |
|
*/ |
|
inline void RenderClxSprite(const Surface &out, ClxSprite clx, Point position) |
|
{ |
|
ClxDraw(out, { position.x, position.y + static_cast<int>(clx.height()) - 1 }, clx); |
|
} |
|
|
|
/** |
|
* @brief Blit a solid colder shape one pixel larger than the given sprite shape, to the given buffer at the given coordinates |
|
* @param col Color index from current palette |
|
* @param out Output buffer |
|
* @param position Target buffer coordinate |
|
* @param clx CLX frame |
|
*/ |
|
void ClxDrawOutline(const Surface &out, uint8_t col, Point position, ClxSprite clx); |
|
|
|
/** |
|
* @brief Same as `ClxDrawOutline` but considers colors with index 0 (usually shadows) to be transparent. |
|
* |
|
* @param col Color index from current palette |
|
* @param out Output buffer |
|
* @param position Target buffer coordinate |
|
* @param clx CLX frame |
|
*/ |
|
void ClxDrawOutlineSkipColorZero(const Surface &out, uint8_t col, Point position, ClxSprite clx); |
|
|
|
/** |
|
* @brief Blit CL2 sprite, and apply given TRN to the given buffer at the given coordinates |
|
* @param out Output buffer |
|
* @param position Target buffer coordinate |
|
* @param clx CLX frame |
|
* @param trn TRN to use |
|
*/ |
|
void ClxDrawTRN(const Surface &out, Point position, ClxSprite clx, const uint8_t *trn); |
|
|
|
/** |
|
* @brief Same as ClxDrawTRN but position.y is the top of the sprite instead of the bottom. |
|
*/ |
|
inline void RenderClxSpriteWithTRN(const Surface &out, ClxSprite clx, Point position, const uint8_t *trn) |
|
{ |
|
ClxDrawTRN(out, { position.x, position.y + static_cast<int>(clx.height()) - 1 }, clx, trn); |
|
} |
|
|
|
void ClxDrawBlendedTRN(const Surface &out, Point position, ClxSprite clx, const uint8_t *trn); |
|
|
|
/** |
|
* @brief Blit CLX sprite with 50% transparency to the given buffer at the given coordinates. |
|
* @param out Output buffer |
|
* @param position Target buffer coordinate |
|
* @param clx CLX frame |
|
*/ |
|
void ClxDrawBlended(const Surface &out, Point position, ClxSprite clx); |
|
|
|
/** |
|
* @brief Blit CL2 sprite, and apply lighting, to the given buffer at the given coordinates |
|
* @param out Output buffer |
|
* @param position Target buffer coordinate |
|
* @param clx CLX frame |
|
* @param lightmap Per-pixel light buffer |
|
*/ |
|
void ClxDrawWithLightmap(const Surface &out, Point position, ClxSprite clx, const Lightmap &lightmap); |
|
|
|
/** |
|
* @brief Blit CL2 sprite, and apply lighting and transparency blending, to the given buffer at the given coordinates |
|
* @param out Output buffer |
|
* @param position Target buffer coordinate |
|
* @param clx CLX frame |
|
* @param lightmap Per-pixel light buffer |
|
*/ |
|
void ClxDrawBlendedWithLightmap(const Surface &out, Point position, ClxSprite clx, const Lightmap &lightmap); |
|
|
|
/** |
|
* Returns if cursor is within the CLX sprite (ignores shadow) |
|
*/ |
|
bool IsPointWithinClx(Point position, ClxSprite clx); |
|
|
|
/** |
|
* Returns a pair of X coordinates containing the start (inclusive) and end (exclusive) |
|
* of fully transparent columns in the sprite. |
|
*/ |
|
std::pair<int, int> ClxMeasureSolidHorizontalBounds(ClxSprite clx); |
|
|
|
/** |
|
* @brief Clears the CLX draw cache. |
|
* |
|
* Must be called whenever CLX sprites are freed. |
|
*/ |
|
void ClearClxDrawCache(); |
|
|
|
#ifdef DEBUG_CLX |
|
std::string ClxDescribe(ClxSprite clx); |
|
#endif |
|
|
|
} // namespace devilution
|
|
|