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; }
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; }