Lephisto/src/collision.c

68 lines
1.9 KiB
C

#include "lephisto.h"
#include "log.h"
#include "collision.h"
// Collide sprite at (asx, asy) int 'at' at pos 'ap' with sprite at (bsx,bsy)
//in 'bt' at 'bp'
// at - Texture a.
// asx - Position of x of sprite a.
// asy - Position of y of sprite a.
// ap - Position in space of sprite a.
// bt - Texture b.
// bsx - Position of x of sprite b.
// bsy - Position of y of sprite b.
// bp - Position in space of sprite b.
int CollideSprite(const glTexture* at, const int asx, const int asy,
const Vec2* ap, const glTexture* bt,
const int bsx, const int bsy, const Vec2* bp) {
int x,y;
int ax1, ax2, ay1, ay2;
int bx1, bx2, by1, by2;
int inter_x0, inter_x1, inter_y0, inter_y1;
int rasy, rbsy;
int abx, aby, bbx, bby;
// a - cube coords.
ax1 = (int)VX(*ap) - (int)(at->sw)/2;
ay1 = (int)VY(*ap) - (int)(at->sh)/2;
ax2 = ax1 + (int)(at->sw) - 1;
ay2 = ay1 + (int)(at->sh) - 1;
// b - cube coords.
bx1 = (int)VX(*bp) - (int)(bt->sw)/2;
by1 = (int)VY(*bp) - (int)(bt->sh)/2;
bx2 = bx1 + (int)(bt->sw) - 1;
by2 = by1 + (int)(bt->sh) - 1;
// Check if bounding boxes intersect.
if((bx2 < ax1) || (ax2 < bx1)) return 0;
if((by2 < ay1) || (ay2 < by1)) return 0;
// Define the remaining binding box.
inter_x0 = MAX(ax1, bx1);
inter_x1 = MIN(ax2, bx2);
inter_y0 = MAX(ay1, by1);
inter_y1 = MIN(ay2, by2);
// Real vertical sprite value (flipped).
rasy = at->sy - asy - 1;
rbsy = bt->sy - bsy - 1;
// Set up the base points.
abx = asx*(int)(at->sw) - ax1;
aby = rasy*(int)(at->sh) - ay1;
bbx = bsx*(int)(bt->sw) - bx1;
bby = rbsy*(int)(bt->sh) - by1;
for(y = inter_y0; y <= inter_y1; y++)
for(x = inter_x0; x <= inter_x1; x++)
// Compute offsets for surface before passing to TransparentPixel test.
if((!gl_isTrans(at, abx + x, aby + y)) &&
(!gl_isTrans(bt, bbx + x, bby + y)))
return 1;
return 0;
}