1 //////////////////////////////////////////////////////////////////////////////// 2 // Scorched3D (c) 2000-2011 3 // 4 // This file is part of Scorched3D. 5 // 6 // Scorched3D is free software; you can redistribute it and/or modify 7 // it under the terms of the GNU General Public License as published by 8 // the Free Software Foundation; either version 2 of the License, or 9 // (at your option) any later version. 10 // 11 // Scorched3D is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 // 16 // You should have received a copy of the GNU General Public License along 17 // with this program; if not, write to the Free Software Foundation, Inc., 18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 //////////////////////////////////////////////////////////////////////////////// 20 21 22 #if !defined(__INCLUDE_PhysicsParticleObjecth_INCLUDE__) 23 #define __INCLUDE_PhysicsParticleObjecth_INCLUDE__ 24 25 #include <common/FixedVector.h> 26 #include <common/FixedVector4.h> 27 #include <engine/ScorchedCollisionIds.h> 28 29 enum PhysicsParticleType 30 { 31 ParticleTypeNone = 0, 32 ParticleTypeShot, 33 ParticleTypeBounce, 34 ParticleTypeFalling 35 }; 36 37 struct PhysicsParticleInfo 38 { PhysicsParticleInfoPhysicsParticleInfo39 PhysicsParticleInfo( 40 PhysicsParticleType type, 41 unsigned int playerId, 42 void *data) : 43 type_(type), 44 playerId_(playerId), 45 data_(data) 46 { 47 } 48 49 PhysicsParticleType type_; 50 unsigned int playerId_; 51 void *data_; 52 }; 53 54 class PhysicsParticleObject; 55 class PhysicsParticleObjectHandler 56 { 57 public: 58 virtual void collision(PhysicsParticleObject &position, 59 ScorchedCollisionId collisionId) = 0; wallCollision(PhysicsParticleObject & position,ScorchedCollisionId collisionId)60 virtual void wallCollision(PhysicsParticleObject &position, 61 ScorchedCollisionId collisionId) {} 62 }; 63 64 class Target; 65 class ScorchedContext; 66 class PhysicsParticleObject 67 { 68 public: 69 PhysicsParticleObject(); 70 virtual ~PhysicsParticleObject(); 71 72 void setPhysics( 73 PhysicsParticleInfo info, 74 ScorchedContext &context, 75 FixedVector &position, FixedVector &velocity, 76 fixed sphereSize = 0, 77 fixed sphereDensity = 0, 78 fixed windFactor = 1, 79 fixed gravityFactor = 1, 80 bool underGroundCollision = false, 81 bool rotateOnCollision = false, 82 bool wallCollision = true, 83 bool stickyShields = false); 84 85 void applyForce(FixedVector &force); 86 void applyOffset(FixedVector &offset); 87 void simulate(fixed frameTime); 88 getPosition()89 FixedVector &getPosition() { return position_; } getVelocity()90 FixedVector &getVelocity() { return velocity_; } getRotationQuat()91 FixedVector4 &getRotationQuat() { return rotation_; } 92 setHandler(PhysicsParticleObjectHandler * handler)93 void setHandler(PhysicsParticleObjectHandler *handler) { handler_ = handler; } setPosition(FixedVector & position)94 void setPosition(FixedVector &position) { position_ = position; } 95 96 protected: 97 PhysicsParticleInfo info_; 98 ScorchedContext *context_; 99 PhysicsParticleObjectHandler *handler_; 100 bool underGroundCollision_; 101 bool rotateOnCollision_; 102 bool wallCollision_; 103 bool stickyShields_; 104 unsigned int iterations_; 105 FixedVector position_; 106 FixedVector velocity_; 107 FixedVector windFactor_; 108 FixedVector4 rotation_; 109 FixedVector4 avelocity_; 110 111 enum CollisionAction 112 { 113 CollisionActionNone = 0, 114 CollisionActionCollision, 115 CollisionActionBounce 116 }; 117 struct CollisionInfo 118 { 119 ScorchedCollisionId collisionId; 120 fixed deflectFactor; 121 FixedVector normal; 122 }; 123 124 virtual void shotWallHit(CollisionInfo &collision); 125 virtual void shotShieldHit(Target *target); 126 virtual void bounceShieldHit(Target *target); 127 128 void checkCollision(); 129 CollisionAction checkShotCollision(CollisionInfo &collision, Target *target); 130 CollisionAction checkBounceCollision(CollisionInfo &collision, Target *target); 131 CollisionAction checkFallingCollision(CollisionInfo &collision, Target *target); 132 133 bool getLandscapeCollision(CollisionInfo &collision); 134 bool getRoofCollision(CollisionInfo &collision); 135 bool getWallCollision(CollisionInfo &collision); 136 bool getShieldCollision(CollisionInfo &collision, Target *target); 137 bool getTargetCollision(CollisionInfo &collision, Target *target); 138 bool getTargetBounceCollision(CollisionInfo &collision, Target *target); 139 }; 140 141 class PhysicsParticleActionObject : public PhysicsParticleObject 142 { 143 public: 144 PhysicsParticleActionObject(); 145 virtual ~PhysicsParticleActionObject(); 146 147 protected: 148 virtual void shotWallHit(CollisionInfo &collision); 149 virtual void shotShieldHit(Target *target); 150 virtual void bounceShieldHit(Target *target); 151 }; 152 153 #endif 154