• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 The zlib/libpng License
3 
4 Copyright (c) 2005-2007 Phillip Castaneda (pjcast -- www.wreckedgames.com)
5 
6 This software is provided 'as-is', without any express or implied warranty. In no event will
7 the authors be held liable for any damages arising from the use of this software.
8 
9 Permission is granted to anyone to use this software for any purpose, including commercial
10 applications, and to alter it and redistribute it freely, subject to the following
11 restrictions:
12 
13     1. The origin of this software must not be misrepresented; you must not claim that
14 		you wrote the original software. If you use this software in a product,
15 		an acknowledgment in the product documentation would be appreciated but is
16 		not required.
17 
18     2. Altered source versions must be plainly marked as such, and must not be
19 		misrepresented as being the original software.
20 
21     3. This notice may not be removed or altered from any source distribution.
22 */
23 #ifndef OIS_Effect_H
24 #define OIS_Effect_H
25 
26 #include "OISPrereqs.h"
27 
28 namespace OIS
29 {
30 	//Predeclare some Effect Property structs
31 	class ForceEffect;
32 	class ConstantEffect;
33 	class RampEffect;
34 	class PeriodicEffect;
35 	class ConditionalEffect;
36 
37 	/**
38 		Force Feedback is a relatively complex set of properties to upload to a device.
39 		The best place for information on the different properties, effects, etc is in
40 		the DX Documentation and MSDN - there are even pretty graphs ther =)
41 		As this class is modeled on the the DX interface you can apply that same
42 		knowledge to creating effects via this class on any OS supported by OIS.
43 
44 		In anycase, this is the main class you will be using. There is *absolutely* no
45 		need to instance any of the supporting ForceEffect classes yourself.
46 	*/
47 	class _OISExport Effect
48 	{
49 		/**
50 			hidden so this class cannot be instanced with default constructor
51 		*/
52 		Effect();
53 	public:
54 		//! Type of force
55 		enum EForce
56 		{
57 			UnknownForce = 0,
58 			ConstantForce,
59 			RampForce,
60 			PeriodicForce,
61 			ConditionalForce,
62 			CustomForce,
63 			_ForcesNumber // Always keep in last position.
64 		};
65 
66 		static const char* getForceTypeName(EForce eValue);
67 
68 		//! Type of effect
69 		enum EType
70 		{
71 			//Type ----- Pairs with force:
72 			Unknown = 0, //UnknownForce
73 			Constant,    //ConstantForce
74 			Ramp,        //RampForce
75 			Square,      //PeriodicForce
76 			Triangle,    //PeriodicForce
77             Sine,        //PeriodicForce
78 			SawToothUp,  //PeriodicForce
79 			SawToothDown,//PeriodicForce
80 			Friction,    //ConditionalForce
81 			Damper,      //ConditionalForce
82 			Inertia,     //ConditionalForce
83 			Spring,      //ConditionalForce
84 			Custom,      //CustomForce
85 			_TypesNumber // Always keep in last position.
86 		};
87 
88 		static const char* getEffectTypeName(EType eValue);
89 
90 		//! Direction of the Force
91 		enum EDirection
92 		{
93 			NorthWest,
94 			North,
95 			NorthEast,
96 			East,
97 			SouthEast,
98 			South,
99 			SouthWest,
100 			West,
101 			_DirectionsNumber // Always keep in last position.
102 		};
103 
104 		static const char* getDirectionName(EDirection eValue);
105 
106 		/**
107 			This constructor allows you to set the force type and effect.
108 		*/
109 		Effect(EForce ef, EType et);
110 		virtual ~Effect();
111 
112 		const EForce force;
113 		const EType type;
114 
115 		//Infinite Time
116 		static const unsigned int OIS_INFINITE = 0xFFFFFFFF;
117 
118 		//-------------------------------------------------------------------//
119 		//--- Set these variables before uploading or modifying an effect ---//
120 
121 		//Direction to apply to the force - affects two axes+ effects
122 		EDirection direction;
123 
124 		//Number of button triggering an effect (-1 means no trigger)
125 		short trigger_button;
126 
127 		//Time to wait before an effect can be re-triggered (microseconds)
128 		unsigned int trigger_interval;
129 
130 		//Duration of an effect (microseconds)
131 		unsigned int replay_length;
132 
133 		//Time to wait before to start playing an effect (microseconds)
134 		unsigned int replay_delay;
135 
136 		//Get the specific Force Effect. This should be cast depending on the EForce
137 		ForceEffect* getForceEffect() const;
138 
139 		/**
140 		@remarks
141 			Set the number of Axes to use before the initial creation of the effect.
142 			Can only be done prior to creation! Use the FF interface to determine
143 			how many axes can be used (are availiable)
144 		*/
145 		void setNumAxes(short nAxes);
146 
147 		/**
148 		@remarks
149 			Returns the number of axes used in this effect
150 		*/
151 		short getNumAxes() const;
152 
153 		//------------- Library Internal -------------------------------------//
154 		/**
155 			set internally.. do not change or you will not be able to upload/stop
156 			this effect any more. It will become lost. It is mutable so even
157 			with const reference it can/will be changed by this lib
158 		*/
159 		mutable int _handle;
160 	protected:
161 		ForceEffect* effect; //Properties depend on EForce
162 		short axes;          //Number of axes to use in effect
163 	};
164 
165 	//-----------------------------------------------------------------------------//
166 	/**
167 		Base class of all effect property classes
168 	*/
169 	class _OISExport ForceEffect
170 	{
171 	public:
~ForceEffect()172 		virtual ~ForceEffect() {}
173 	};
174 
175 	//-----------------------------------------------------------------------------//
176 	/**
177 		An optional envelope to be applied to the start/end of an effect. If any of
178 		these values are nonzero, then the envelope will be used in setting up the
179 		effect.
180 	*/
181 	class _OISExport Envelope : public ForceEffect
182 	{
183 	public:
Envelope()184 		Envelope() : attackLength(0), attackLevel(0), fadeLength(0), fadeLevel(0) {}
185 #if defined(OIS_MSVC_COMPILER)
186   #pragma warning (push)
187   #pragma warning (disable : 4800)
188 #endif
isUsed()189 		bool isUsed() const { return attackLength | attackLevel | fadeLength | fadeLevel; }
190 #if defined(OIS_MSVC_COMPILER)
191   #pragma warning (pop)
192 #endif
193 
194 		// Duration of the attack (microseconds)
195 		unsigned int attackLength;
196 
197 		// Absolute level at the beginning of the attack (0 to 10K)
198 		// (automatically signed when necessary by FF core according to effect level sign)
199 		unsigned short attackLevel;
200 
201 		// Duration of fade (microseconds)
202 		unsigned int fadeLength;
203 
204 		// Absolute level at the end of fade (0 to 10K)
205 		// (automatically signed when necessary by FF core according to effect level sign)
206 		unsigned short fadeLevel;
207 	};
208 
209 	//-----------------------------------------------------------------------------//
210 	/**
211 		Use this class when dealing with Force type of Constant
212 	*/
213 	class _OISExport ConstantEffect : public ForceEffect
214 	{
215 	public:
ConstantEffect()216 		ConstantEffect() : level(5000) {}
217 
218 		class Envelope envelope; //Optional envolope
219 		signed short level;       //-10K to +10k
220 	};
221 
222 	//-----------------------------------------------------------------------------//
223 	/**
224 		Use this class when dealing with Force type of Ramp
225 	*/
226 	class _OISExport RampEffect : public ForceEffect
227 	{
228 	public:
RampEffect()229 		RampEffect() : startLevel(0), endLevel(0) {}
230 
231         class Envelope envelope; //Optional envelope
232 		signed short startLevel;  //-10K to +10k
233 		signed short endLevel;    //-10K to +10k
234 	};
235 
236 	//-----------------------------------------------------------------------------//
237 	/**
238 		Use this class when dealing with Force type of Periodic
239 	*/
240 	class _OISExport PeriodicEffect : public ForceEffect
241 	{
242 	public:
PeriodicEffect()243 		PeriodicEffect() : magnitude(0), offset(0), phase(0), period(0) {}
244 
245 		class Envelope envelope;  //Optional Envelope
246 
247 		unsigned short magnitude;  //0 to 10,0000
248 		signed short   offset;
249 		unsigned short phase;      //Position at which playback begins 0 to 35,999
250 		unsigned int   period;     //Period of effect (microseconds)
251 	};
252 
253 	//-----------------------------------------------------------------------------//
254 	/**
255 		Use this class when dealing with Force type of Condional
256 	*/
257 	class _OISExport ConditionalEffect : public ForceEffect
258 	{
259 	public:
ConditionalEffect()260 		ConditionalEffect() :
261             rightCoeff(0), leftCoeff(0), rightSaturation(0), leftSaturation(0),
262 			deadband(0), center(0) {}
263 
264 		signed short   rightCoeff;      //-10k to +10k (Positive Coeff)
265 		signed short   leftCoeff;       //-10k to +10k (Negative Coeff)
266 
267 		unsigned short rightSaturation; //0 to 10k (Pos Saturation)
268 		unsigned short leftSaturation;  //0 to 10k (Neg Saturation)
269 
270 		//Region around center in which the condition is not active, in the range
271 		//from 0 through 10,000
272 		unsigned short deadband;
273 
274 		//(Offset in DX) -10k and 10k
275 		signed short center;
276 	};
277 }
278 #endif //OIS_Effect_H
279