00001 00002 /* 00003 TSGL - Teddy Space Game Library 00004 Copyright (C) 2002 Timo Suoranta 00005 tksuoran@cc.helsinki.fi 00006 00007 This library is free software; you can redistribute it and/or 00008 modify it under the terms of the GNU Lesser General Public 00009 License as published by the Free Software Foundation; either 00010 version 2.1 of the License, or (at your option) any later version. 00011 00012 This library is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 Lesser General Public License for more details. 00016 00017 You should have received a copy of the GNU Lesser General Public 00018 License along with this library; if not, write to the Free Software 00019 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00020 00021 $Id: CollisionInstance.cpp,v 1.1 2002/01/08 20:47:05 tksuoran Exp $ 00022 */ 00023 00024 00025 #include "Teddy/SpaceGame/CollisionGroup.h" 00026 #include "Teddy/SpaceGame/CollisionInstance.h" 00027 #include "Teddy/SpaceGame/Simulated.h" 00028 00029 00030 namespace Teddy { 00031 namespace SpaceGame { 00032 00033 00039 CollisionInstance::CollisionInstance( const char *name, Mesh *mesh ) 00040 : 00041 SimulatedInstance(name,mesh), 00042 collision_group (NULL) 00043 { 00044 } 00045 00046 00048 /*virtual*/ CollisionInstance::~CollisionInstance(){ 00049 } 00050 00051 00053 /*virtual*/ void CollisionInstance::tick(){ 00054 lock(); 00055 translate( tick_translation ); 00056 if( collision_group != NULL ){ 00057 collision_group->doCollisions( this ); 00058 } 00059 rotate ( tick_rotation ); 00060 heading ( tick_local_rotation.v[0] ); 00061 pitch ( tick_local_rotation.v[1] ); 00062 roll ( tick_local_rotation.v[2] ); 00063 tick_rotation.rotate( tick_rotation_delta ); 00064 tick_translation += tick_translation_delta; 00065 tick_local_rotation += tick_local_rotation_delta; 00066 unlock(); 00067 } 00068 00070 void CollisionInstance::setCollisionGroup( CollisionGroup *cg ){ 00071 this->collision_group = cg; 00072 } 00073 00074 00076 /*virtual*/ bool CollisionInstance::collisionCheck( CollisionInstance *other ){ 00077 float distance = this->distanceTo( *other ); 00078 if( distance < this->getClipRadius() + other->getClipRadius() ){ 00079 this->applyCollision( other ); 00080 other->applyCollision( this ); 00081 return true; 00082 } 00083 return false; 00084 } 00085 00086 00088 /*virtual*/ void CollisionInstance::applyCollision( CollisionInstance *ci ){ 00089 tick_translation *= -1; 00090 translate( tick_translation ); 00091 tick_translation = DoubleVector( 0, 0, 0 ); 00092 // ui->playExplode(); 00093 } 00094 00095 00096 }; // namespace SpaceGame 00097 }; // namespace Teddy 00098