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