naev 0.10.4
Macros | Functions
collision.c File Reference

Deals with 2d collisions. More...

#include "collision.h"
#include "log.h"

Go to the source code of this file.

Macros

#define FX(A, B, C, x)   (-(A * x + C) / B)
 
#define FY(A, B, C, y)   (-(B * y + C) / A)
 

Functions

static int pointInPolygon (const CollPoly *at, const vec2 *ap, float x, float y)
 Checks whether or not a point is inside a polygon. More...
 
static int LineOnPolygon (const CollPoly *at, const vec2 *ap, float x1, float y1, float x2, float y2, vec2 *crash)
 Checks whether or not a line intersects a polygon. More...
 
void LoadPolygon (CollPoly *polygon, xmlNodePtr node)
 Loads a polygon from an xml node. More...
 
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, vec2 *crash)
 Checks whether or not two sprites collide. More...
 
int CollideSpritePolygon (const CollPoly *at, const vec2 *ap, const glTexture *bt, const int bsx, const int bsy, const vec2 *bp, vec2 *crash)
 Checks whether or not a sprite collides with a polygon. More...
 
int CollidePolygon (const CollPoly *at, const vec2 *ap, const CollPoly *bt, const vec2 *bp, vec2 *crash)
 Checks whether or not two polygons collide. /!\ The function is not symmetric: the points of polygon 2 are tested against the polygon 1. Consequently, it works better if polygon 2 is small. More...
 
void RotatePolygon (CollPoly *rpolygon, CollPoly *ipolygon, float theta)
 Rotates a polygon. More...
 
int CollideLineLine (double s1x, double s1y, double e1x, double e1y, double s2x, double s2y, double e2x, double e2y, vec2 *crash)
 Checks to see if two lines collide. More...
 
int CollideLineSprite (const vec2 *ap, double ad, double al, const glTexture *bt, const int bsx, const int bsy, const vec2 *bp, vec2 crash[2])
 Checks to see if a line collides with a sprite. More...
 
int CollideLinePolygon (const vec2 *ap, double ad, double al, const CollPoly *bt, const vec2 *bp, vec2 crash[2])
 Checks to see if a line collides with a polygon. More...
 
static int linePointOnSegment (double d1, double x1, double y1, double x2, double y2, double x, double y)
 
int CollideLineCircle (const vec2 *p1, const vec2 *p2, const vec2 *cc, double cr, vec2 crash[2])
 Checks to see if a line collides with a circle. More...
 
double CollideCircleIntersection (const vec2 *p1, double r1, const vec2 *p2, double r2)
 

Detailed Description

Deals with 2d collisions.

Definition in file collision.c.

Macro Definition Documentation

◆ FX

#define FX (   A,
  B,
  C,
 
)    (-(A * x + C) / B)

Definition at line 774 of file collision.c.

◆ FY

#define FY (   A,
  B,
  C,
 
)    (-(B * y + C) / A)

Definition at line 775 of file collision.c.

Function Documentation

◆ CollideCircleIntersection()

double CollideCircleIntersection ( const vec2 p1,
double  r1,
const vec2 p2,
double  r2 
)

Definition at line 887 of file collision.c.

◆ CollideLineCircle()

int CollideLineCircle ( const vec2 p1,
const vec2 p2,
const vec2 cc,
double  cr,
vec2  crash[2] 
)

Checks to see if a line collides with a circle.

Parameters
[in]p1Point 1 of the line segment.
[in]p2Point 2 of the line segment.
[in]ccCenter of the circle.
[in]crRadius of the circle.
[out]crashPosition of the collision.
Returns
1 on collision, 0 else.

Definition at line 786 of file collision.c.

◆ CollideLineLine()

int CollideLineLine ( double  s1x,
double  s1y,
double  e1x,
double  e1y,
double  s2x,
double  s2y,
double  e2x,
double  e2y,
vec2 crash 
)

Checks to see if two lines collide.

Parameters
[in]s1xX start point of line 1.
[in]s1yY start point of line 1.
[in]e1xX end point of line 1.
[in]e1yY end point of line 1.
[in]s2xX start point of line 2.
[in]s2yY start point of line 2.
[in]e2xX end point of line 2.
[in]e2yY end point of line 2.
[out]crashPosition of the collision.
Returns
3 if lines are coincident, 2 if lines are parallel, 1 if lines just collide on a point, or 0 if they don't.

Definition at line 448 of file collision.c.

◆ CollideLinePolygon()

int CollideLinePolygon ( const vec2 ap,
double  ad,
double  al,
const CollPoly bt,
const vec2 bp,
vec2  crash[2] 
)

Checks to see if a line collides with a polygon.

First collisions are detected on all the walls of the polygon's rectangle. Then the collisions are tested on every line of the polygon.

Parameters
[in]apOrigin of the line.
[in]adDirection of the line.
[in]alLength of the line.
[in]btPolygon b.
[in]bpPosition in space of polygon b.
[out]crashPosition of the collision.
Returns
1 on collision, 0 else.
See also
CollideLinePolygon

Definition at line 650 of file collision.c.

◆ CollideLineSprite()

int CollideLineSprite ( const vec2 ap,
double  ad,
double  al,
const glTexture bt,
const int  bsx,
const int  bsy,
const vec2 bp,
vec2  crash[2] 
)

Checks to see if a line collides with a sprite.

First collisions are detected on all the walls of the sprite's rectangle. Then the collisions are tested by pixel perfectness until collisions are actually found with the ship itself.

Parameters
[in]apOrigin of the line.
[in]adDirection of the line.
[in]alLength of the line.
[in]btTexture b.
[in]bsxPosition of x of sprite b.
[in]bsyPosition of y of sprite b.
[in]bpPosition in space of sprite b.
[out]crashPosition of the collision.
Returns
1 on collision, 0 else.
See also
CollideSprite

Definition at line 501 of file collision.c.

◆ CollidePolygon()

int CollidePolygon ( const CollPoly at,
const vec2 ap,
const CollPoly bt,
const vec2 bp,
vec2 crash 
)

Checks whether or not two polygons collide. /!\ The function is not symmetric: the points of polygon 2 are tested against the polygon 1. Consequently, it works better if polygon 2 is small.

Parameters
[in]atPolygon a.
[in]apPosition in space of polygon a.
[in]btPolygon b.
[in]bpPosition in space of polygon b.
[out]crashActual position of the collision (only set on collision).
Returns
1 on collision, 0 else.

Definition at line 254 of file collision.c.

◆ CollideSprite()

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,
vec2 crash 
)

Checks whether or not two sprites collide.

This function does pixel perfect checks. If the collision actually occurs, crash is set to store the real position of the collision.

Parameters
[in]atTexture a.
[in]asxPosition of x of sprite a.
[in]asyPosition of y of sprite a.
[in]apPosition in space of sprite a.
[in]btTexture b.
[in]bsxPosition of x of sprite b.
[in]bsyPosition of y of sprite b.
[in]bpPosition in space of sprite b.
[out]crashActual position of the collision (only set on collision).
Returns
1 on collision, 0 else.

Definition at line 97 of file collision.c.

◆ CollideSpritePolygon()

int CollideSpritePolygon ( const CollPoly at,
const vec2 ap,
const glTexture bt,
const int  bsx,
const int  bsy,
const vec2 bp,
vec2 crash 
)

Checks whether or not a sprite collides with a polygon.

Parameters
[in]atPolygon a.
[in]apPosition in space of polygon a.
[in]btTexture b.
[in]bsxPosition of x of sprite b.
[in]bsyPosition of y of sprite b.
[in]bpPosition in space of sprite b.
[out]crashActual position of the collision (only set on collision).
Returns
1 on collision, 0 else.

Definition at line 179 of file collision.c.

◆ LineOnPolygon()

int LineOnPolygon ( const CollPoly at,
const vec2 ap,
float  x1,
float  y1,
float  x2,
float  y2,
vec2 crash 
)
static

Checks whether or not a line intersects a polygon.

Parameters
[in]atPolygon a.
[in]apPosition in space of polygon a.
[in]x1Coordiante of point 1.
[in]y1Coordinate of point 1.
[in]x2Coordiante of point 2.
[in]y2Coordinate of point 2.
[out]crashcoordinates of the intersection.
Returns
1 on collision, 0 else.

Definition at line 408 of file collision.c.

◆ linePointOnSegment()

static int linePointOnSegment ( double  d1,
double  x1,
double  y1,
double  x2,
double  y2,
double  x,
double  y 
)
static

Definition at line 766 of file collision.c.

◆ LoadPolygon()

void LoadPolygon ( CollPoly polygon,
xmlNodePtr  node 
)

Loads a polygon from an xml node.

Parameters
[out]polygonPolygon.
[in]nodexml node.

Definition at line 32 of file collision.c.

◆ pointInPolygon()

int pointInPolygon ( const CollPoly at,
const vec2 ap,
float  x,
float  y 
)
static

Checks whether or not a point is inside a polygon.

Parameters
[in]atPolygon a.
[in]apPosition in space of polygon a.
[in]xCoordiante of point.
[in]yCoordinate of point.
Returns
1 on collision, 0 else.

Definition at line 362 of file collision.c.

◆ RotatePolygon()

void RotatePolygon ( CollPoly rpolygon,
CollPoly ipolygon,
float  theta 
)

Rotates a polygon.

Parameters
[out]rpolygonRotated polygon.
[in]ipolygonImput polygon.
[in]thetaRotation angle (radian).

Definition at line 325 of file collision.c.