From a140cccd0481e1753a461e5f74502e45e5ac9763 Mon Sep 17 00:00:00 2001 From: Tamir Atias Date: Thu, 12 Apr 2012 20:05:05 +0300 Subject: [PATCH] [Add] Added AABB rendering. --- src/Collision/AABB.cpp | 82 +++++++++++++++++++++++++++--------------- src/Collision/AABB.h | 4 ++- 2 files changed, 57 insertions(+), 29 deletions(-) diff --git a/src/Collision/AABB.cpp b/src/Collision/AABB.cpp index 0130a5a..0ad9d29 100644 --- a/src/Collision/AABB.cpp +++ b/src/Collision/AABB.cpp @@ -1,10 +1,12 @@ +#include #include +#include #include "AABB.h" - -typedef Uint32 DWORD; +#include "../Texture/Texture.h" AABB::AABB(void) { - _sprite = 0; + _surface = NULL; + _texture = NULL; // _max represents the top left. _max = Vec2(0,0); // _min is the bottom left. @@ -21,9 +23,13 @@ AABB::AABB(Vec2 &min, Vec2 &max) { } AABB::~AABB(void) { - if(_sprite) { - SDL_FreeSurface(_sprite); - _sprite = NULL; + if(_surface) { + SDL_FreeSurface(_surface); + _surface = NULL; + } + if(_texture) { + textureManager.Destroy(_texture); + _texture = NULL; } } @@ -55,54 +61,61 @@ bool AABB::InCollision(AABB* otherAABB) { void AABB::CreateAABBFromSprite(const char* filename) { std::string tempName(filename); tempName += ".png"; - _sprite = IMG_Load(filename); - if(!_sprite) { + + _surface = IMG_Load(filename); + if(!_surface) { + return; + } + + _texture = textureManager.Load(filename); + if(_texture) { + SDL_FreeSurface(_surface); return; } // I have no methods here, hopefully KonoM will have it // implemented real soon... - //float spriteWidth = _sprite->w; - //float spriteHeight = _sprite->h; + //float spriteWidth = _surface->w; + //float spriteHeight = _surface->h; // Find the min, look through until we find a first instance of a white color. bool found = false; int color = 0; - DWORD* pixels = (DWORD*)_sprite->pixels; + Uint32* pixels = (Uint32*)_surface->pixels; - for(int width = 0; width < _sprite->w; width++) { - for(int height = 0; height < _sprite->h; height++) { + for(int width = 0; width < _surface->w; width++) { + for(int height = 0; height < _surface->h; height++) { // FUCKING PAIN IN THE ASS MOTHERFUCKER!!!! - DWORD offset = height * screen->pitch + width; + Uint32 offset = height * screen->pitch + width; if(((DWORD)pixels[offset]) != 0 && !found) { _min = Vec2((float)width, (float)height); found = true; - color = ((DWORD)pixels[offset]); + color = ((Uint32)pixels[offset]); // Break out of these god forsaken loops. - width = _sprite->w; - height = _sprite->h; + width = _surface->w; + height = _surface->h; } } } // Let's try to find the max.x now.. - _max.x = (float)_sprite->w; + _max.x = (float)_surface->w; found = false; - for(int width = (int)_min.x; width < _sprite->w; width++) { - DWORD offset = (DWORD)_min.y * screen->pitch + width; - if(((DWORD)pixels[offset] != color && !found)) { + for(int width = (int)_min.x; width < _surface->w; width++) { + Uint32 offset = (Uint32)_min.y * screen->pitch + width; + if(((Uint32)pixels[offset] != color && !found)) { found = true; _max.x = (float)width; } } // Now for the max.y - _max.y = (float)_sprite->h; + _max.y = (float)_surface->h; found = false; - for(int height = (int)_min.y; height < _sprite->w; height++) { - DWORD offset = height * screen->pitch + (DWORD)_min.x; - if(((DWORD)pixels[offset]) != color && !found) { + for(int height = (int)_min.y; height < _surface->w; height++) { + Uint32 offset = height * screen->pitch + (Uint32)_min.x; + if(((Uint32)pixels[offset]) != color && !found) { found = true; _max.y = (float)height; break; @@ -110,10 +123,23 @@ void AABB::CreateAABBFromSprite(const char* filename) { } _staticMax = _max; _staticMin = _min; - delete _sprite; - _sprite = 0; + + SDL_FreeSurface(_surface); + _surface = NULL; } void AABB::Render(void) { - // FUCK YOU KonoM!! + glEnable(GL_TEXTURE_2D); + BindTexture(_texture->GetTexID()); + + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex2f(_min.x, _min.y); + glTexCoord2f(1.0f, 0.0f); + glVertex2f(_max.x, _min.y); + glTexCoord2f(1.0f, 1.0f); + glVertex2f(_max.x, _max.y); + glTexCoord2f(0.0f, 1.0f); + glVertex2f(_min.x, _max.y); + glEnd(); } diff --git a/src/Collision/AABB.h b/src/Collision/AABB.h index 51889cd..9060b77 100644 --- a/src/Collision/AABB.h +++ b/src/Collision/AABB.h @@ -13,6 +13,7 @@ */ struct SDL_Surface; +class Texture; class AABB { public: @@ -42,5 +43,6 @@ private: Vec2 _staticMin; Vec2 _staticMax; - SDL_Surface* _sprite; + SDL_Surface* _surface; + Texture* _texture; };