summaryrefslogtreecommitdiff
path: root/lib/sprite.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sprite.cc')
-rw-r--r--lib/sprite.cc132
1 files changed, 132 insertions, 0 deletions
diff --git a/lib/sprite.cc b/lib/sprite.cc
new file mode 100644
index 0000000..be2fd3b
--- /dev/null
+++ b/lib/sprite.cc
@@ -0,0 +1,132 @@
+#include <SDL.h>
+#include "sprite.h"
+
+#define TEXSIZE 256
+
+mogltk::Sprite::TexList * mogltk::Sprite::TexList::header = 0;
+
+mogltk::Sprite::Sprite(Handle * h, int asx, int asy) : sx(asx), sy(asy) {
+ alloc();
+ for (int y = 0; y < sy; y++) {
+ h->read(tlist->GetTex()->pixels + TEXSIZE * y + posx, sx);
+ }
+}
+
+mogltk::Sprite::Sprite(Uint8 * p, int asx, int asy) : sx(asx), sy(asy) {
+ alloc();
+ for (int y = 0; y < sy; y++) {
+ bcopy(p, tlist->GetTex()->pixels + TEXSIZE * y + posx, sx);
+ p += sx;
+ }
+}
+
+mogltk::Sprite::~Sprite() {
+ if (prev)
+ prev->next = next
+ else
+ tlist->sprheader = next;
+ if (next)
+ next->prev = prev;
+
+ if (!tlist->sprheader) {
+ delete tlist;
+ }
+}
+
+void mogltk::Sprite::alloc() {
+ /* FIXMEEEEEEEEEEEEE */
+ bool found = false;
+ TexList * p;
+
+ for (p = tlist; p && !found; p = p->GetNext()) {
+ for (y = 0; (py < (TEXSIZE - sy)) && !found; py++) {
+ for (x = 0; (px < (TEXSIZE - sx)) && !found; px++) {
+ if (p->strheader->canfit(x, y, x + sx, y + sy)) {
+ found = true;
+ }
+ }
+ }
+ }
+
+ if (!found) {
+#ifdef DEBUG
+ printm(M_INFO, "Allocating a new texture for sprites\n");
+#endif
+ x = y = 0;
+ p = new TexList(TEXSIZE);
+ }
+
+ tlist = p;
+}
+
+mogltk::Sprite::TexList::TexList(int size) {
+ tex = new texture(size, size, true);
+
+ if (header)
+ header->next->prev = this;
+ prev = 0;
+ next = header;
+ header = this;
+}
+
+mogltk::Sprite::TexList::~TexList() {
+ delete tex;
+ if (prev)
+ prev->next = next
+ else
+ header = next;
+ if (next)
+ next->prev = prev;
+}
+
+const mogltk::texture * mogltk::Sprite::TexList::GetTex() const {
+ return tex;
+}
+
+const mogltk::Sprite::TexList * mogltk::Sprite::TexList::GetHead() const {
+ return header;
+}
+
+const mogltk::Sprite::TexList * mogltk::Sprite::TexList::GetNext() const {
+ return next;
+}
+
+void mogltk::Sprite::TexList::Bind() const {
+ tex->Bind();
+}
+
+bool mogltk::Sprite::intersect(int x1, int y1, int x2, int y2) const {
+ int sx1 = x, sy1 = y, sx2 = x + sx, sy2 = y + sy;
+
+ return !((sx1 >= x2) || (sx2 <= x1) || (sy1 >= y1) || (sy2 <= y2));
+}
+
+bool mogltk::Sprite::canfit(int x1, int y1, int x2, int y2) const {
+ if (!intersect(x1, y1, x2, y2))
+ return true
+ else
+ if (next)
+ return next->canfit()
+ else
+ return false;
+}
+
+void mogltk::Sprite::draw(int dx, int dy, Color c) {
+ bool was2D;
+
+ was2D = mogltk::glbase::is2D();
+
+ if (!was2D)
+ mogltk::glbase::Enter2DMode();
+
+ tlist->Bind();
+ glBegin(GL_TRIANGLE_STRIP);
+ glTexCoord2i(x , y ); glVertex2i(dx , dy );
+ glTexCoord2i(x + sx - 1, y ); glVertex2i(dx + sx - 1, dy );
+ glTexCoord2i(x , y + sy - 1); glVertex2i(dx , dy + sy - 1);
+ glTexCoord2i(x + sx - 1, y + sy - 1); glVertex2i(dx + sx - 1, dy + sy - 1);
+ glEnd();
+
+ if (!was2D)
+ mogltk::glbase::Leave2DMode();
+}