All pastes #382087 Raw Edit

collision.h

public cpp v1 · immutable
·published 2007-03-05 09:01 UTC
rendered paste body
/*** collision.h**** Some nice vector functions and stuff... for PixelMachine** by SuperJer**** Email = superjer@superjer.com** Web   = http://www.superjer.com/**** You can do whatever you like with this code, I don't care,** just please recognize me as the original author. :)***/#define NO_COLLISION -1.0struct V{    double x;    double y;    double z;};struct COLOR{    double r;    double g;    double b;    double a;};struct SPHERE{    V center;    double radius;    COLOR color;};V &add( V &out, const V &a, const V &b );V &subtract( V &out, const V &a, const V &b );V &cross( V &out, const V &a, const V &b );V &scale( V &out, double n );V &normalize( V &out, double n );V &mirror( V &out, const V &in, const V &mirror );void CollideRaySphere( double &t, const V &o, const V &v, const V &p, const double &r );V &add( V &out, const V &a, const V &b ){    out.x = a.x + b.x;    out.y = a.y + b.y;    out.z = a.z + b.z;    return out;}V &subtract( V &out, const V &a, const V &b ){    out.x = a.x - b.x;    out.y = a.y - b.y;    out.z = a.z - b.z;    return out;}V &cross( V &out, const V &a, const V &b ){    out.x = a.y*b.z - a.z*b.y;    out.y = a.z*b.x - a.x*b.z;    out.z = a.x*b.y - a.y*b.x;    return out;}V &scale( V &out, double n ){    out.x *= n;    out.y *= n;    out.z *= n;    return out;}V &normalize( V &out, double n ){    double l = sqrt(out.x*out.x + out.y*out.y + out.z*out.z);    out.x *= n/l;    out.y *= n/l;    out.z *= n/l;    return out;}V &mirror( V &out, const V &in, const V &mirror ){	V perp1, perp2;	cross( perp1, in, mirror );	cross( perp2, perp1, mirror );		const double &a = mirror.x;	const double &b = perp2.x;	const double &c = in.x;	const double &x = mirror.y;	const double &y = perp2.y;	const double &z = in.y;	const double &i = mirror.z;	const double &j = perp2.z;	const double &k = in.z;		double n, m;	if( a > -0.0001 && a < 0.0001 )	{		if( i > -0.0001 && i < 0.0001 )		{			out.x = -in.x;            out.y =  in.y;			out.z = -in.z;			return out;		}		else		{			n = (z - (x*k)/i)/(y - (x*j)/i);			m = (k - (j*n))/i;		}	}	else	{		n = (z - (x*c)/a)/(y - (x*b)/a);		m = (c - (b*n))/a;	}	V v1, v2;    v1 = mirror;    v2 = perp2;	scale( v1, m );	scale( v2, n );	subtract( out, v1, v2 );    return out;}// This function is part of the SPARToR game engine by SuperJer.comvoid CollideRaySphere( double &t, const V &o, const V &v, const V &p, const double &r ){	double a, b, c, d, ox, oy, oz;	// quadratic formula	ox = o.x - p.x;	oy = o.y - p.y;	oz = o.z - p.z;	a = 2.0*(v.x*v.x + v.y*v.y + v.z*v.z);	b = 2.0*(v.x*ox + v.y*oy + v.z*oz);	c = ox*ox + oy*oy + oz*oz - r*r;	d = b*b - 2.0*a*c; // determinant	if( d < 0.0 ) // no intersection at all	{		t = NO_COLLISION;		return;	}	a = 1.0 / a;	d = sqrt( d );	t = (-d - b) * a;	if( t >= 0.0 ) return; // smaller root wins	t = ( d - b) * a;	if( t >= 0.0 ) return; // bigger root wins	t = NO_COLLISION;	return; // no root in range}