mirror of
https://github.com/spiffcode/hostile-takeover.git
synced 2026-03-26 06:48:27 -06:00
95 lines
2.1 KiB
C++
95 lines
2.1 KiB
C++
#include "game/ht.h"
|
|
#include "game/sdl/sdlspritemgr.h"
|
|
#include "SDL.h"
|
|
|
|
namespace wi {
|
|
|
|
SdlSpriteManager::SdlSpriteManager() {
|
|
pcrit_ = new base::CriticalSection();
|
|
cpspr_ = 0;
|
|
fSpriteDirty_ = false;
|
|
memset(&rcClip1_, 0, sizeof(rcClip1_));
|
|
memset(&rcClip2_, 0, sizeof(rcClip2_));
|
|
}
|
|
|
|
SdlSpriteManager::~SdlSpriteManager() {
|
|
|
|
}
|
|
|
|
void SdlSpriteManager::Add(wi::Sprite *pspr) {
|
|
base::CritScope cs(pcrit_);
|
|
|
|
// If already added, just recreate the layer
|
|
|
|
bool fFound = false;
|
|
for (int i = 0; i < cpspr_; i++) {
|
|
if (pspr == apspr_[i]) {
|
|
fFound = true;
|
|
}
|
|
}
|
|
if (!fFound && cpspr_ < ARRAYSIZE(apspr_) - 1) {
|
|
apspr_[cpspr_] = pspr;
|
|
cpspr_++;
|
|
}
|
|
|
|
fSpriteDirty_ = true;
|
|
}
|
|
|
|
void SdlSpriteManager::Remove(wi::Sprite *pspr) {
|
|
base::CritScope cs(pcrit_);
|
|
|
|
bool fFound = false;
|
|
for (int i = 0; i < cpspr_; i++) {
|
|
if (pspr == apspr_[i]) {
|
|
cpspr_--;
|
|
if (i < ARRAYSIZE(apspr_) - 1) {
|
|
memmove(&apspr_[i], &apspr_[i + 1],
|
|
(ARRAYSIZE(apspr_) - 1 - i) * ELEMENTSIZE(apspr_));
|
|
}
|
|
fFound = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
fSpriteDirty_ = true;
|
|
}
|
|
|
|
void SdlSpriteManager::Update(wi::Sprite *pspr) {
|
|
fSpriteDirty_ = true;
|
|
}
|
|
|
|
void SdlSpriteManager::DrawSprites(SDL_Renderer *renderer, Size siz) {
|
|
base::CritScope cs(pcrit_);
|
|
|
|
if (cpspr_ == 0) {
|
|
return;
|
|
}
|
|
|
|
for (int i = 0; i < cpspr_; i++) {
|
|
// Draw clipped to rcClip1
|
|
SDL_RenderSetClipRect(renderer, &rcClip1_);
|
|
apspr_[i]->Draw(renderer, &siz);
|
|
|
|
// Draw clipped to rcClip2
|
|
SDL_RenderSetClipRect(renderer, &rcClip2_);
|
|
apspr_[i]->Draw(renderer, &siz);
|
|
}
|
|
|
|
SDL_RenderSetClipRect(renderer, NULL);
|
|
}
|
|
|
|
void SdlSpriteManager::SetClipRects(wi::Rect *prc1, wi::Rect *prc2) {
|
|
rcClip1_.x = prc1->left;
|
|
rcClip1_.y = prc1->top;
|
|
rcClip1_.w = prc1->Width();
|
|
rcClip1_.h = prc1->Height();
|
|
|
|
rcClip2_.x = prc2->left;
|
|
rcClip2_.y = prc2->top;
|
|
rcClip2_.w = prc2->Width();
|
|
rcClip2_.h = prc2->Height();
|
|
}
|
|
|
|
|
|
} // namespace wi
|