[Add] Added AABB rendering.
This commit is contained in:
parent
7aa8d9adb2
commit
a140cccd04
@ -1,10 +1,12 @@
|
||||
#include <SDL/SDL.h>
|
||||
#include <SDL/SDL_image.h>
|
||||
#include <SDL/SDL_opengl.h>
|
||||
#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();
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user