OSDN Git Service

フォーラム[#56172] SlimDX(改)のフォルダ内容が不完全だったので再UP。
[dtxmania/dtxmania.git] / SlimDXc_Jun2010(VC++2008) / source / directinput / ObjectProperties.cpp
1 /*\r
2 * Copyright (c) 2007-2010 SlimDX Group\r
3\r
4 * Permission is hereby granted, free of charge, to any person obtaining a copy\r
5 * of this software and associated documentation files (the "Software"), to deal\r
6 * in the Software without restriction, including without limitation the rights\r
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
8 * copies of the Software, and to permit persons to whom the Software is\r
9 * furnished to do so, subject to the following conditions:\r
10\r
11 * The above copyright notice and this permission notice shall be included in\r
12 * all copies or substantial portions of the Software.\r
13\r
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
20 * THE SOFTWARE.\r
21 */\r
22 #include "stdafx.h"\r
23 \r
24 #include "DirectInputException.h"\r
25 \r
26 #include "Enums.h"\r
27 #include "DeviceConstantConverter.h"\r
28 #include "ObjectProperties.h"\r
29 #include "Guids.h"\r
30 \r
31 using namespace System;\r
32 using namespace System::Runtime::InteropServices;\r
33 \r
34 namespace SlimDX\r
35 {\r
36 namespace DirectInput\r
37 {\r
38         ObjectProperties::ObjectProperties( IDirectInputDevice8W* pointer, String^ name, Type^ dataFormat )\r
39         {\r
40                 this->pointer = pointer;\r
41                 how = DIPH_BYOFFSET;\r
42 \r
43                 obj = Marshal::OffsetOf( dataFormat, name ).ToInt32();\r
44         }\r
45 \r
46         ObjectProperties::ObjectProperties( IDirectInputDevice8W* pointer, int value, bool isUsageCode )\r
47         {\r
48                 this->pointer = pointer;\r
49 \r
50                 if( isUsageCode )\r
51                         how = DIPH_BYUSAGE;\r
52                 else\r
53                         how = DIPH_BYID;\r
54 \r
55                 obj = value;\r
56         }\r
57 \r
58         int ObjectProperties::LowerRange::get()\r
59         {\r
60                 DIPROPRANGE dip;\r
61                 HRESULT hr;\r
62                 dip.diph.dwSize = sizeof( DIPROPRANGE );\r
63                 dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );\r
64                 dip.diph.dwObj = obj;\r
65                 dip.diph.dwHow = how;\r
66 \r
67                 hr = pointer->GetProperty( DIPROP_RANGE, &dip.diph );\r
68                 RECORD_DINPUT( hr );\r
69 \r
70                 if( FAILED( hr ) )\r
71                         return 0;\r
72 \r
73                 return dip.lMin;\r
74         }\r
75 \r
76         int ObjectProperties::UpperRange::get()\r
77         {\r
78                 DIPROPRANGE dip;\r
79                 HRESULT hr;\r
80                 dip.diph.dwSize = sizeof( DIPROPRANGE );\r
81                 dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );\r
82                 dip.diph.dwObj = obj;\r
83                 dip.diph.dwHow = how;\r
84 \r
85                 hr = pointer->GetProperty( DIPROP_RANGE, &dip.diph );\r
86                 RECORD_DINPUT( hr );\r
87 \r
88                 if( FAILED( hr ) )\r
89                         return 0;\r
90 \r
91                 return dip.lMax;\r
92         }\r
93 \r
94         void ObjectProperties::SetRange( int lowerRange, int upperRange )\r
95         {\r
96                 DIPROPRANGE dip;\r
97                 HRESULT hr;\r
98                 dip.diph.dwSize = sizeof( DIPROPRANGE );\r
99                 dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );\r
100                 dip.diph.dwObj = obj;\r
101                 dip.diph.dwHow = how;\r
102                 dip.lMin = lowerRange;\r
103                 dip.lMax = upperRange;\r
104 \r
105                 hr = pointer->SetProperty( DIPROP_RANGE, &dip.diph );\r
106                 RECORD_DINPUT( hr );\r
107         }\r
108 \r
109         Object^ ObjectProperties::ApplicationData::get()\r
110         {\r
111                 DIPROPPOINTER dip;\r
112                 HRESULT hr;\r
113                 dip.diph.dwSize = sizeof( DIPROPPOINTER );\r
114                 dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );\r
115                 dip.diph.dwObj = obj;\r
116                 dip.diph.dwHow = how;\r
117 \r
118                 hr = pointer->GetProperty( DIPROP_APPDATA, &dip.diph );\r
119                 RECORD_DINPUT( hr );\r
120 \r
121                 if( FAILED( hr ) || dip.uData == NULL )\r
122                         return nullptr;\r
123 \r
124                 IntPtr pointer( reinterpret_cast<void*>( dip.uData ) );\r
125                 GCHandle handle = GCHandle::FromIntPtr( pointer );\r
126                 if( !handle.IsAllocated )\r
127                         return nullptr;\r
128 \r
129                 Object^ obj =  handle.Target;\r
130                 handle.Free();\r
131                 return obj;\r
132         }\r
133 \r
134         void ObjectProperties::ApplicationData::set( Object^ value )\r
135         {\r
136                 DIPROPPOINTER dip;\r
137                 HRESULT hr;\r
138                 dip.diph.dwSize = sizeof( DIPROPPOINTER );\r
139                 dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );\r
140                 dip.diph.dwObj = obj;\r
141                 dip.diph.dwHow = how;\r
142 \r
143                 GCHandle handle = GCHandle::Alloc( value, GCHandleType::Pinned );\r
144                 dip.uData = reinterpret_cast<UINT_PTR>( handle.ToIntPtr( handle ).ToPointer() );\r
145 \r
146                 hr = pointer->SetProperty( DIPROP_APPDATA, &dip.diph );\r
147                 RECORD_DINPUT( hr );\r
148 \r
149                 handle.Free();\r
150         }\r
151 \r
152         int ObjectProperties::DeadZone::get()\r
153         {\r
154                 DIPROPDWORD dip;\r
155                 HRESULT hr;\r
156                 dip.diph.dwSize = sizeof( DIPROPDWORD );\r
157                 dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );\r
158                 dip.diph.dwObj = obj;\r
159                 dip.diph.dwHow = how;\r
160 \r
161                 hr = pointer->GetProperty( DIPROP_DEADZONE, &dip.diph );\r
162                 RECORD_DINPUT( hr );\r
163 \r
164                 if( FAILED( hr ) )\r
165                         return 0;\r
166 \r
167                 return dip.dwData;\r
168         }\r
169 \r
170         void ObjectProperties::DeadZone::set( int value )\r
171         {\r
172                 DIPROPDWORD dip;\r
173                 HRESULT hr;\r
174                 dip.diph.dwSize = sizeof( DIPROPDWORD );\r
175                 dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );\r
176                 dip.diph.dwObj = obj;\r
177                 dip.diph.dwHow = how;\r
178                 dip.dwData = value;\r
179 \r
180                 hr = pointer->SetProperty( DIPROP_DEADZONE, &dip.diph );\r
181                 RECORD_DINPUT( hr );\r
182         }\r
183 \r
184         int ObjectProperties::Granularity::get()\r
185         {\r
186                 DIPROPDWORD dip;\r
187                 HRESULT hr;\r
188                 dip.diph.dwSize = sizeof( DIPROPDWORD );\r
189                 dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );\r
190                 dip.diph.dwObj = obj;\r
191                 dip.diph.dwHow = how;\r
192 \r
193                 hr = pointer->GetProperty( DIPROP_GRANULARITY, &dip.diph );\r
194                 RECORD_DINPUT( hr );\r
195 \r
196                 if( FAILED( hr ) )\r
197                         return 0;\r
198 \r
199                 return dip.dwData;\r
200         }\r
201 \r
202         int ObjectProperties::Saturation::get()\r
203         {\r
204                 DIPROPDWORD dip;\r
205                 HRESULT hr;\r
206                 dip.diph.dwSize = sizeof( DIPROPDWORD );\r
207                 dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );\r
208                 dip.diph.dwObj = obj;\r
209                 dip.diph.dwHow = how;\r
210 \r
211                 hr = pointer->GetProperty( DIPROP_SATURATION, &dip.diph );\r
212                 RECORD_DINPUT( hr );\r
213 \r
214                 if( FAILED( hr ) )\r
215                         return 0;\r
216 \r
217                 return dip.dwData;\r
218         }\r
219 \r
220         void ObjectProperties::Saturation::set( int value )\r
221         {\r
222                 DIPROPDWORD dip;\r
223                 HRESULT hr;\r
224                 dip.diph.dwSize = sizeof( DIPROPDWORD );\r
225                 dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );\r
226                 dip.diph.dwObj = obj;\r
227                 dip.diph.dwHow = how;\r
228                 dip.dwData = value;\r
229 \r
230                 hr = pointer->SetProperty( DIPROP_SATURATION, &dip.diph );\r
231                 RECORD_DINPUT( hr );\r
232         }\r
233 \r
234         InputRange ObjectProperties::LogicalRange::get()\r
235         {\r
236                 DIPROPRANGE dip;\r
237                 HRESULT hr;\r
238                 dip.diph.dwSize = sizeof( DIPROPRANGE );\r
239                 dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );\r
240                 dip.diph.dwObj = obj;\r
241                 dip.diph.dwHow = how;\r
242 \r
243                 hr = pointer->GetProperty( DIPROP_LOGICALRANGE, &dip.diph );\r
244                 if (RECORD_DINPUT(hr).IsFailure)\r
245                         return InputRange();\r
246 \r
247                 return InputRange(dip.lMin, dip.lMax);\r
248         }\r
249 \r
250         InputRange ObjectProperties::PhysicalRange::get()\r
251         {\r
252                 DIPROPRANGE dip;\r
253                 HRESULT hr;\r
254                 dip.diph.dwSize = sizeof( DIPROPRANGE );\r
255                 dip.diph.dwHeaderSize = sizeof( DIPROPHEADER );\r
256                 dip.diph.dwObj = obj;\r
257                 dip.diph.dwHow = how;\r
258 \r
259                 hr = pointer->GetProperty( DIPROP_PHYSICALRANGE, &dip.diph );\r
260                 if (RECORD_DINPUT(hr).IsFailure)\r
261                         return InputRange();\r
262 \r
263                 return InputRange(dip.lMin, dip.lMax);\r
264         }\r
265 }\r
266 }