hostile-takeover/game/sdl/sdlspritemgr.cpp
2016-08-31 22:43:36 -04:00

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