Exemplo n.º 1
0
bool ShapeCollisionImage::collide(SimCollisionImage* image, CollisionSurfaceList *list )
{
	AssertFatal(collisionDetail!=-1,
		"ShapeCollisionImage::collide: collisionDetail not set or set improperly.");
	AssertFatal(shapeInst,
		"ShapeCollisionImage::collide:  shape not set or set improperly.");

	TMat3F mat;
	switch (image->getType()) {
		case Sphere: {
			buildImageTransform(image,list,&mat);
			SimCollisionSphereImage* si = static_cast<SimCollisionSphereImage*>(image);
			return shapeInst->collideSphere
				(collisionDetail,si->center,si->radius,&mat,list,
					collisionLevel==CollideFaces);
		}
		case Box: {
			buildImageTransform(image,list,&mat);
			SimCollisionBoxImage* bi = static_cast<SimCollisionBoxImage*>(image);
			return checkBox(bi,&mat,list);
		}
		case Tube: {
			buildImageTransform(image,list,&mat);
			SimCollisionTubeImage* ti = static_cast<SimCollisionTubeImage*>(image);
			return shapeInst->collideTube
				(collisionDetail,ti->start,ti->end,ti->radius,&mat,list,
					collisionLevel==CollideFaces);
		}
		case Line: {
         // Collides line with TS3 shape
			// Lines always collide with the highest detail level.
			buildImageTransform(image,list,&mat);
			SimCollisionLineImage* li = static_cast<SimCollisionLineImage*>(image);
			return shapeInst->collideLine(0,li->start,li->end,&mat,list,
				collisionLevel==CollideFaces);
		}
		//
		case Terrain: {
			SimCollisionTerrImage* ti = static_cast<SimCollisionTerrImage*>(image);
			return checkTerrain(ti,list);
		}
		case Interior: {
			SimCollisionItrImage* ii = static_cast<SimCollisionItrImage*>(image);
			return checkInterior(ii,list);
		}
		case ShapeCollisionImageType: {
			ShapeCollisionImage* si = static_cast<ShapeCollisionImage*>(image);
			return checkShape(si,list);
		}
		default:
			AssertFatal(0,"ShapeCollisionImage:collide: Unrecognized type");
			break;
	}
	return false;
}
Exemplo n.º 2
0
void interiorLoop(float x, float y)
{
	for(int i = 0; i < currentLocation->InteriorNum; i++)
    {
			if(checkInterior(i))
			{
				InInterior = true;
				currentInterior = i;
				currentLocation->interiors[i].getstartxy(x, y);
				y += 20;
				Gerad.Setxy(x, y);
				currentLocation->interiors[i].setdirection();
				currentLocation->interiors[i].exit = currentLocation;
				exitLocation = currentLocation;
				currentLocation = currentLocation->interiors[i].getLocation();
				background.load(exitLocation->interiors[i].getLocation()->getName());
				background.loadGLTextures();
				return;
			}
	}
}
bool PlayerCollisionImage::collide(SimCollisionImage* image, CollisionSurfaceList *list )
{
	AssertFatal(collisionDetail!=-1,
		"PlayerCollisionImage::collide: collisionDetail not set or set improperly.");
	AssertFatal(shapeInst,
		"PlayerCollisionImage::collide:  shape not set or set improperly.");

	// Test collision of image argument against this image.
	// Collision surfaces are returned in this image space.

	// Build the transform which goes from image space to the
	// space in which the testing will take place.
	TMat3F mat;
	list->stepVector.set(0,0,-1);

	// Do the tests...
	switch (image->getType()) {
		case Sphere: {
			buildImageTransform(image,list,&mat);
			SimCollisionSphereImage* si = static_cast<SimCollisionSphereImage*>(image);
			return shapeInst->collideSphere
				(collisionDetail,si->center,si->radius,&mat,list,
					collisionLevel==CollideFaces);
		}
		case Box: {
			buildImageTransform(image,list,&mat);
			SimCollisionBoxImage* bi = static_cast<SimCollisionBoxImage*>(image);
			return checkBox(bi,&mat,list);
		}
		case Tube: {
			buildImageTransform(image,list,&mat);
			SimCollisionTubeImage* ti = static_cast<SimCollisionTubeImage*>(image);
			return shapeInst->collideTube
				(collisionDetail,ti->start,ti->end,ti->radius,&mat,list,
					collisionLevel==CollideFaces);
		}
		case Line: {
         Point3F a,b;
         RealF hit;

         SimCollisionLineImage *line = static_cast<SimCollisionLineImage *>(image);
         
         Parent::buildImageTransform(image, &mat);
         m_mul(line->start, mat, &a);
         m_mul(line->end,   mat, &b);

         if(m_lineAABox(a, b, crouchBox.fMin, crouchBox.fMax, hit))
         {
            CollisionSurface surface;

				surface.time = hit;
            surface.position.x = line->start.x + (hit * (line->end.x - line->start.x));
            surface.position.y = line->start.y + (hit * (line->end.y - line->start.y));
            surface.position.z = line->start.z + (hit * (line->end.z - line->start.z));
            surface.distance = m_distf(surface.position, line->start);
            surface.normal.set(0, 0, 1);  // incomplete and wrong
            surface.material = surface.surface = 0;
				
				list->tWorld.identity();
				list->push_back(surface);
            
            return (true);
         }
         return (false);

#if 0
         // Collides line with bounding box (axis-aligned) -- easier to hit
         // than line/TS3, more accurate than line/Sphere
         float   rTime = 0.0f;
         Point3F objStart, objEnd;
         Parent::buildImageTransform(image, &mat);

         SimCollisionLineImage *line = static_cast<SimCollisionLineImage *>(image);

         m_mul(line->start, mat, &objStart);
         m_mul(line->end,   mat, &objEnd);

         return (m_lineAABox(objStart, objEnd,
            bbox.fMin, bbox.fMax, rTime) && rTime > 0.0f);
#endif
#if 0
         // Collides line with sphere -- temporary "fix" to make it a little 
         //easier to hit others 
         SimCollisionSphereImage sphere;
         
         sphere.center    = this->sphere.center;
         sphere.radius    = this->sphere.radius;
         sphere.transform = transform;

         SimCollisionLineImage *line = 
            static_cast<SimCollisionLineImage *>(image);

         return (line->collide(&sphere, list));
#endif
#if 0
         // Collides line with TS3 shape -- very difficult to hit
			buildImageTransform(image,list,&mat);
			SimCollisionLineImage* li = static_cast<SimCollisionLineImage*>(image);
			return shapeInst->collideLine
				(collisionDetail,li->start,li->end,&mat,list,
				collisionLevel==CollideFaces);
#endif
		}
		//
		case Terrain: {
			SimCollisionTerrImage* ti = static_cast<SimCollisionTerrImage*>(image);
			return checkTerrain(ti,list);
		}
		case Interior: {
			SimCollisionItrImage* ii = static_cast<SimCollisionItrImage*>(image);
			return checkInterior(ii,list);
		}
		case ShapeCollisionImageType: {
			ShapeCollisionImage* si = static_cast<ShapeCollisionImage*>(image);
			return checkShape(si,list);
		}
		case PlayerCollisionImageType: {
			PlayerCollisionImage* pi = static_cast<PlayerCollisionImage*>(image);
			return checkPlayer(pi,list);
		}
		default:
			AssertFatal(0,"PlayerCollisionImage:collide: Unrecognized type");
			break;
	}
	return false;
}