/dingus/tools/AmbOccTool/src/crackdecl.cpp

https://github.com/aras-p/dingus · C++ · 400 lines · 327 code · 61 blank · 12 comment · 28 complexity · 7eb8a3588a31ccaa08f240f5f885fac7 MD5 · raw file

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (C) 2000 Microsoft Corporation. All Rights Reserved.
  4. //
  5. // File: crackdecl.cpp
  6. // Content: Used to access vertex data using Declarations
  7. // Updated Oct 16, 2001 to decode DX9 decls
  8. //
  9. //////////////////////////////////////////////////////////////////////////////
  10. #include "crackdecl.h"
  11. //----------------------------------------------------------------------------
  12. // CD3DXCrackDecl methods
  13. //----------------------------------------------------------------------------
  14. CD3DXCrackDecl::CD3DXCrackDecl()
  15. {
  16. for(UINT i = 0; i < 16; i++)
  17. {
  18. dwStride[i] = 0;
  19. }
  20. }
  21. const WCHAR *x_szDeclStrings[MAXD3DDECLUSAGE+2] = {
  22. L"D3DDECLUSAGE_POSITION",
  23. L"D3DDECLUSAGE_BLENDWEIGHT",
  24. L"D3DDECLUSAGE_BLENDINDICES",
  25. L"D3DDECLUSAGE_NORMAL",
  26. L"D3DDECLUSAGE_PSIZE",
  27. L"D3DDECLUSAGE_TEXCOORD",
  28. L"D3DDECLUSAGE_TANGENT",
  29. L"D3DDECLUSAGE_BINORMAL",
  30. L"D3DDECLUSAGE_TESSFACTOR",
  31. L"D3DDECLUSAGE_POSITIONT",
  32. L"D3DDECLUSAGE_COLOR",
  33. L"D3DDECLUSAGE_FOG",
  34. L"D3DDECLUSAGE_DEPTH",
  35. L"D3DDECLUSAGE_SAMPLE",
  36. L"UNKNOWN",
  37. };
  38. const WCHAR *CD3DXCrackDecl::DeclUsageToString(D3DDECLUSAGE usage)
  39. {
  40. if (usage >= D3DDECLUSAGE_POSITION && usage <= MAXD3DDECLUSAGE)
  41. {
  42. return x_szDeclStrings[usage];
  43. }
  44. else
  45. {
  46. return x_szDeclStrings[MAXD3DDECLUSAGE+1];
  47. }
  48. }
  49. HRESULT
  50. CD3DXCrackDecl::SetDeclaration(CONST D3DVERTEXELEMENT9 *pDecl)
  51. {
  52. pElements = pDecl;
  53. dwNumElements = D3DXGetDeclLength(pDecl);
  54. return S_OK;
  55. }
  56. HRESULT
  57. CD3DXCrackDecl::SetStreamSource(UINT Stream, LPVOID pData, UINT Stride)
  58. {
  59. pStream[Stream] = (LPBYTE) pData;
  60. if(Stride == 0)
  61. dwStride[Stream] = D3DXGetDeclVertexSize(pElements,Stream);
  62. else
  63. dwStride[Stream] = Stride;
  64. return S_OK;
  65. }
  66. VOID
  67. CD3DXCrackDecl::Decode(CONST D3DVERTEXELEMENT9 *pElem, UINT index,FLOAT* pData, UINT cData)
  68. {
  69. FLOAT Data[4];
  70. if(pElem)
  71. {
  72. LPVOID pElement = GetElementPointer(pElem,index);
  73. switch(pElem->Type)
  74. {
  75. case D3DDECLTYPE_FLOAT1:
  76. Data[0] = ((FLOAT *) pElement)[0];
  77. Data[1] = 0.0f;
  78. Data[2] = 0.0f;
  79. Data[3] = 1.0f;
  80. break;
  81. case D3DDECLTYPE_FLOAT2:
  82. Data[0] = ((FLOAT *) pElement)[0];
  83. Data[1] = ((FLOAT *) pElement)[1];
  84. Data[2] = 0.0f;
  85. Data[3] = 1.0f;
  86. break;
  87. case D3DDECLTYPE_FLOAT3:
  88. Data[0] = ((FLOAT *) pElement)[0];
  89. Data[1] = ((FLOAT *) pElement)[1];
  90. Data[2] = ((FLOAT *) pElement)[2];
  91. Data[3] = 1.0f;
  92. break;
  93. case D3DDECLTYPE_FLOAT4:
  94. Data[0] = ((FLOAT *) pElement)[0];
  95. Data[1] = ((FLOAT *) pElement)[1];
  96. Data[2] = ((FLOAT *) pElement)[2];
  97. Data[3] = ((FLOAT *) pElement)[3];
  98. break;
  99. case D3DDECLTYPE_D3DCOLOR:
  100. Data[0] = (1.0f / 255.0f) * (FLOAT) (UINT8) (*((D3DCOLOR *) pElement) >> 16);
  101. Data[1] = (1.0f / 255.0f) * (FLOAT) (UINT8) (*((D3DCOLOR *) pElement) >> 8);
  102. Data[2] = (1.0f / 255.0f) * (FLOAT) (UINT8) (*((D3DCOLOR *) pElement) >> 0);
  103. Data[3] = (1.0f / 255.0f) * (FLOAT) (UINT8) (*((D3DCOLOR *) pElement) >> 24);
  104. break;
  105. case D3DDECLTYPE_UBYTE4:
  106. Data[0] = (FLOAT) ((UINT8 *) pElement)[0];
  107. Data[1] = (FLOAT) ((UINT8 *) pElement)[1];
  108. Data[2] = (FLOAT) ((UINT8 *) pElement)[2];
  109. Data[3] = (FLOAT) ((UINT8 *) pElement)[3];
  110. break;
  111. case D3DDECLTYPE_SHORT2:
  112. Data[0] = (FLOAT) ((INT16 *) pElement)[0];
  113. Data[1] = (FLOAT) ((INT16 *) pElement)[1];
  114. Data[2] = 0.0f;
  115. Data[3] = 1.0f;
  116. break;
  117. case D3DDECLTYPE_SHORT4:
  118. Data[0] = (FLOAT) ((INT16 *) pElement)[0];
  119. Data[1] = (FLOAT) ((INT16 *) pElement)[1];
  120. Data[2] = (FLOAT) ((INT16 *) pElement)[2];
  121. Data[3] = (FLOAT) ((INT16 *) pElement)[3];
  122. break;
  123. case D3DDECLTYPE_UBYTE4N:
  124. Data[0] = (1.0f / 255.0f) * (FLOAT) (((UINT8 *) pElement)[0]);
  125. Data[1] = (1.0f / 255.0f) * (FLOAT) (((UINT8 *) pElement)[1]);
  126. Data[2] = (1.0f / 255.0f) * (FLOAT) (((UINT8 *) pElement)[2]);
  127. Data[3] = (1.0f / 255.0f) * (FLOAT) (((UINT8 *) pElement)[3]);
  128. break;
  129. case D3DDECLTYPE_SHORT2N:
  130. {
  131. INT16 nX = (((INT16 *) pElement)[0]);
  132. INT16 nY = (((INT16 *) pElement)[1]);
  133. nX += (-32768 == nX);
  134. nY += (-32768 == nY);
  135. Data[0] = (1.0f / 32767.0f) * (FLOAT) nX;
  136. Data[1] = (1.0f / 32767.0f) * (FLOAT) nY;
  137. Data[2] = 0.0f;
  138. Data[3] = 1.0f;
  139. }
  140. break;
  141. case D3DDECLTYPE_SHORT4N:
  142. {
  143. INT16 nX = (((INT16 *) pElement)[0]);
  144. INT16 nY = (((INT16 *) pElement)[1]);
  145. INT16 nZ = (((INT16 *) pElement)[2]);
  146. INT16 nW = (((INT16 *) pElement)[3]);
  147. nX += (-32768 == nX);
  148. nY += (-32768 == nY);
  149. nZ += (-32768 == nZ);
  150. nW += (-32768 == nW);
  151. Data[0] = (1.0f / 32767.0f) * (FLOAT) nX;
  152. Data[1] = (1.0f / 32767.0f) * (FLOAT) nY;
  153. Data[2] = (1.0f / 32767.0f) * (FLOAT) nZ;
  154. Data[3] = (1.0f / 32767.0f) * (FLOAT) nW;
  155. }
  156. break;
  157. case D3DDECLTYPE_USHORT2N:
  158. Data[0] = (1.0f / 65535.0f) * (FLOAT) (((UINT16 *) pElement)[0]);
  159. Data[1] = (1.0f / 65535.0f) * (FLOAT) (((UINT16 *) pElement)[1]);
  160. Data[2] = 0.0f;
  161. Data[3] = 1.0f;
  162. break;
  163. case D3DDECLTYPE_USHORT4N:
  164. Data[0] = (1.0f / 65535.0f) * (FLOAT) (((UINT16 *) pElement)[0]);
  165. Data[1] = (1.0f / 65535.0f) * (FLOAT) (((UINT16 *) pElement)[1]);
  166. Data[2] = (1.0f / 65535.0f) * (FLOAT) (((UINT16 *) pElement)[2]);
  167. Data[3] = (1.0f / 65535.0f) * (FLOAT) (((UINT16 *) pElement)[3]);
  168. break;
  169. case D3DDECLTYPE_UDEC3:
  170. Data[0] = (FLOAT) ((*((UINT32 *) pElement) >> 0) & 0x3ff);
  171. Data[1] = (FLOAT) ((*((UINT32 *) pElement) >> 10) & 0x3ff);
  172. Data[2] = (FLOAT) ((*((UINT32 *) pElement) >> 20) & 0x3ff);
  173. Data[3] = 1.0f;
  174. break;
  175. case D3DDECLTYPE_DEC3N:
  176. {
  177. INT32 nX = ((*((INT32 *) pElement) << 22)) >> 22;
  178. INT32 nY = ((*((INT32 *) pElement) << 12)) >> 22;
  179. INT32 nZ = ((*((INT32 *) pElement) << 2)) >> 22;
  180. nX += (-512 == nX);
  181. nY += (-512 == nY);
  182. nZ += (-512 == nZ);
  183. Data[0] = (1.0f / 511.0f) * (FLOAT) nX;
  184. Data[1] = (1.0f / 511.0f) * (FLOAT) nY;
  185. Data[2] = (1.0f / 511.0f) * (FLOAT) nZ;
  186. Data[3] = 1.0f;
  187. }
  188. break;
  189. case D3DDECLTYPE_FLOAT16_2:
  190. D3DXFloat16To32Array(Data,(D3DXFLOAT16*)pElement,2);
  191. Data[2] = 0.0f;
  192. Data[3] = 1.0f;
  193. break;
  194. case D3DDECLTYPE_FLOAT16_4:
  195. D3DXFloat16To32Array(Data,(D3DXFLOAT16*)pElement,4);
  196. break;
  197. }
  198. }
  199. else
  200. {
  201. Data[0] = 0.0f;
  202. Data[1] = 0.0f;
  203. Data[2] = 0.0f;
  204. Data[3] = 1.0f;
  205. }
  206. if(cData > 4)
  207. cData = 4;
  208. for(UINT i = 0; i < cData; i++)
  209. pData[i] = Data[i];
  210. }
  211. VOID
  212. CD3DXCrackDecl::Encode(CONST D3DVERTEXELEMENT9 *pElem, UINT index,CONST FLOAT* pData, UINT cData)
  213. {
  214. UINT i = 0;
  215. FLOAT Data[4];
  216. if(cData > 4)
  217. cData = 4;
  218. switch(pElem->Type)
  219. {
  220. case D3DDECLTYPE_D3DCOLOR:
  221. case D3DDECLTYPE_UBYTE4N:
  222. case D3DDECLTYPE_USHORT2N:
  223. case D3DDECLTYPE_USHORT4N:
  224. for(; i < cData; i++)
  225. Data[i] = (0.0f > pData[i]) ? 0.0f : ((1.0f < pData[i]) ? 1.0f : pData[i]);
  226. break;
  227. case D3DDECLTYPE_SHORT2N:
  228. case D3DDECLTYPE_SHORT4N:
  229. case D3DDECLTYPE_DEC3N:
  230. for(; i < cData; i++)
  231. Data[i] = (-1.0f > pData[i]) ? -1.0f : ((1.0f < pData[i]) ? 1.0f : pData[i]);
  232. break;
  233. case D3DDECLTYPE_UBYTE4:
  234. case D3DDECLTYPE_UDEC3:
  235. for(; i < cData; i++)
  236. Data[i] = (0.0f > pData[i]) ? 0.0f : pData[i];
  237. break;
  238. default:
  239. for(; i < cData; i++)
  240. Data[i] = pData[i];
  241. break;
  242. }
  243. for(; i < 3; i++)
  244. Data[i] = 0.0f;
  245. for(; i < 4; i++)
  246. Data[i] = 1.0f;
  247. if(pElem)
  248. {
  249. LPVOID pElement = GetElementPointer(pElem,index);
  250. switch(pElem->Type)
  251. {
  252. case D3DDECLTYPE_FLOAT1:
  253. ((FLOAT *) pElement)[0] = Data[0];
  254. break;
  255. case D3DDECLTYPE_FLOAT2:
  256. ((FLOAT *) pElement)[0] = Data[0];
  257. ((FLOAT *) pElement)[1] = Data[1];
  258. break;
  259. case D3DDECLTYPE_FLOAT3:
  260. ((FLOAT *) pElement)[0] = Data[0];
  261. ((FLOAT *) pElement)[1] = Data[1];
  262. ((FLOAT *) pElement)[2] = Data[2];
  263. break;
  264. case D3DDECLTYPE_FLOAT4:
  265. ((FLOAT *) pElement)[0] = Data[0];
  266. ((FLOAT *) pElement)[1] = Data[1];
  267. ((FLOAT *) pElement)[2] = Data[2];
  268. ((FLOAT *) pElement)[3] = Data[3];
  269. break;
  270. case D3DDECLTYPE_D3DCOLOR:
  271. ((D3DCOLOR *) pElement)[0] =
  272. (((D3DCOLOR) (Data[0] * 255.0f + 0.5f) & 0xff) << 16) |
  273. (((D3DCOLOR) (Data[1] * 255.0f + 0.5f) & 0xff) << 8) |
  274. (((D3DCOLOR) (Data[2] * 255.0f + 0.5f) & 0xff) << 0) |
  275. (((D3DCOLOR) (Data[3] * 255.0f + 0.5f) & 0xff) << 24);
  276. break;
  277. case D3DDECLTYPE_UBYTE4:
  278. ((UINT8 *) pElement)[0] = (UINT8) (Data[0] + 0.5f);
  279. ((UINT8 *) pElement)[1] = (UINT8) (Data[1] + 0.5f);
  280. ((UINT8 *) pElement)[2] = (UINT8) (Data[2] + 0.5f);
  281. ((UINT8 *) pElement)[3] = (UINT8) (Data[3] + 0.5f);
  282. break;
  283. case D3DDECLTYPE_SHORT2:
  284. ((INT16 *) pElement)[0] = (INT16) (Data[0] + 0.5f);
  285. ((INT16 *) pElement)[1] = (INT16) (Data[1] + 0.5f);
  286. break;
  287. case D3DDECLTYPE_SHORT4:
  288. ((INT16 *) pElement)[0] = (INT16) (Data[0] + 0.5f);
  289. ((INT16 *) pElement)[1] = (INT16) (Data[1] + 0.5f);
  290. ((INT16 *) pElement)[2] = (INT16) (Data[2] + 0.5f);
  291. ((INT16 *) pElement)[3] = (INT16) (Data[3] + 0.5f);
  292. break;
  293. case D3DDECLTYPE_UBYTE4N:
  294. ((UINT8 *) pElement)[0] = (UINT8) (Data[0] * 255.0f + 0.5f);
  295. ((UINT8 *) pElement)[1] = (UINT8) (Data[1] * 255.0f + 0.5f);
  296. ((UINT8 *) pElement)[2] = (UINT8) (Data[2] * 255.0f + 0.5f);
  297. ((UINT8 *) pElement)[3] = (UINT8) (Data[3] * 255.0f + 0.5f);
  298. break;
  299. case D3DDECLTYPE_SHORT2N:
  300. ((INT16 *) pElement)[0] = (INT16) (Data[0] * 32767.0f + 0.5f);
  301. ((INT16 *) pElement)[1] = (INT16) (Data[1] * 32767.0f + 0.5f);
  302. break;
  303. case D3DDECLTYPE_SHORT4N:
  304. ((INT16 *) pElement)[0] = (INT16) (Data[0] * 32767.0f + 0.5f);
  305. ((INT16 *) pElement)[1] = (INT16) (Data[1] * 32767.0f + 0.5f);
  306. ((INT16 *) pElement)[2] = (INT16) (Data[2] * 32767.0f + 0.5f);
  307. ((INT16 *) pElement)[3] = (INT16) (Data[3] * 32767.0f + 0.5f);
  308. break;
  309. case D3DDECLTYPE_USHORT2N:
  310. ((UINT16 *) pElement)[0] = (UINT16) (Data[0] * 65535.0f + 0.5f);
  311. ((UINT16 *) pElement)[1] = (UINT16) (Data[1] * 65535.0f + 0.5f);
  312. break;
  313. case D3DDECLTYPE_USHORT4N:
  314. ((UINT16 *) pElement)[0] = (UINT16) (Data[0] * 65535.0f + 0.5f);
  315. ((UINT16 *) pElement)[1] = (UINT16) (Data[1] * 65535.0f + 0.5f);
  316. ((UINT16 *) pElement)[2] = (UINT16) (Data[2] * 65535.0f + 0.5f);
  317. ((UINT16 *) pElement)[3] = (UINT16) (Data[3] * 65535.0f + 0.5f);
  318. break;
  319. case D3DDECLTYPE_UDEC3:
  320. ((UINT32 *) pElement)[0] =
  321. (((UINT32) (Data[0] + 0.5f) & 0x3ff) << 0) |
  322. (((UINT32) (Data[1] + 0.5f) & 0x3ff) << 10) |
  323. (((UINT32) (Data[2] + 0.5f) & 0x3ff) << 20);
  324. break;
  325. case D3DDECLTYPE_DEC3N:
  326. ((UINT32 *) pElement)[0] =
  327. (((UINT32) (Data[0] * 511.0f + 0.5f) & 0x3ff) << 0) |
  328. (((UINT32) (Data[1] * 511.0f + 0.5f) & 0x3ff) << 10) |
  329. (((UINT32) (Data[2] * 511.0f + 0.5f) & 0x3ff) << 20);
  330. break;
  331. case D3DDECLTYPE_FLOAT16_2:
  332. D3DXFloat32To16Array((D3DXFLOAT16*)pElement,Data,2);
  333. break;
  334. case D3DDECLTYPE_FLOAT16_4:
  335. D3DXFloat32To16Array((D3DXFLOAT16*)pElement,Data,4);
  336. break;
  337. }
  338. }
  339. }