home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / directx / misc / d3dmacs.h < prev    next >
C/C++ Source or Header  |  1997-07-14  |  6KB  |  170 lines

  1. /*
  2.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  3.  *
  4.  *  File: d3dmacs.h
  5.  *
  6.  *  Useful macros for generating execute buffers.  Consult the D3D sample
  7.  *  code for examples of their usage.
  8.  *
  9.  *  Use OP_NOP to QWORD align triangle and line instructions.
  10.  */
  11.  
  12. #ifndef __D3DMACS_H__
  13. #define __D3DMACS_H__
  14.  
  15. #undef RELEASE
  16.  
  17. #ifndef __cplusplus
  18. #define MAKE_MATRIX(lpDev, handle, data) \
  19. {   if (lpDev->lpVtbl->CreateMatrix(lpDev, &handle) != D3D_OK) \
  20.         return FALSE; \
  21.     if (lpDev->lpVtbl->SetMatrix(lpDev, handle, &data) != D3D_OK) \
  22.         return FALSE; \
  23. }
  24. #define RELEASE(x) {if (x != NULL) {x->lpVtbl->Release(x); x = NULL;}}
  25. #endif
  26.  
  27. #ifdef __cplusplus
  28. #define MAKE_MATRIX(lpDev, handle, data) \
  29. {   if (lpDev->CreateMatrix(&handle) != D3D_OK) \
  30.         return FALSE; \
  31.     if (lpDev->SetMatrix(handle, &data) != D3D_OK) \
  32.         return FALSE; \
  33. }
  34. #define RELEASE(x) {if (x != NULL) {x->Release(); x = NULL;}}
  35. #endif
  36.  
  37. #define PUTD3DINSTRUCTION(op, sz, cnt, ptr) \
  38. (   ((LPD3DINSTRUCTION) ptr)->bOpcode = op, \
  39.     ((LPD3DINSTRUCTION) ptr)->bSize = sz, \
  40.     ((LPD3DINSTRUCTION) ptr)->wCount = cnt, \
  41.     ptr = (void *)(((LPD3DINSTRUCTION) ptr) + 1) \
  42. )
  43.  
  44. #define VERTEX_DATA(loc, cnt, ptr) \
  45. (   (((ptr) != (loc))? memcpy((ptr), (loc), sizeof(D3DVERTEX) * (cnt)) : 0), \
  46.     ptr = (void *)(((LPD3DVERTEX) (ptr)) + (cnt)) \
  47. )
  48.  
  49. // OP_MATRIX_MULTIPLY size: 4 (sizeof D3DINSTRUCTION)
  50. #define OP_MATRIX_MULTIPLY(cnt, ptr) \
  51.     PUTD3DINSTRUCTION(D3DOP_MATRIXMULTIPLY, sizeof(D3DMATRIXMULTIPLY), cnt, ptr)
  52.  
  53. // MATRIX_MULTIPLY_DATA size: 12 (sizeof MATRIXMULTIPLY)
  54. #define MATRIX_MULTIPLY_DATA(src1, src2, dest, ptr) \
  55. (   ((LPD3DMATRIXMULTIPLY) ptr)->hSrcMatrix1 = src1, \
  56.     ((LPD3DMATRIXMULTIPLY) ptr)->hSrcMatrix2 = src2, \
  57.     ((LPD3DMATRIXMULTIPLY) ptr)->hDestMatrix = dest, \
  58.     ptr = (void *)(((LPD3DMATRIXMULTIPLY) ptr) + 1) \
  59. )
  60.  
  61. // OP_STATE_LIGHT size: 4 (sizeof D3DINSTRUCTION)
  62. #define OP_STATE_LIGHT(cnt, ptr) \
  63.     PUTD3DINSTRUCTION(D3DOP_STATELIGHT, sizeof(D3DSTATE), cnt, ptr)
  64.  
  65. // OP_STATE_TRANSFORM size: 4 (sizeof D3DINSTRUCTION)
  66. #define OP_STATE_TRANSFORM(cnt, ptr) \
  67.     PUTD3DINSTRUCTION(D3DOP_STATETRANSFORM, sizeof(D3DSTATE), cnt, ptr)
  68.  
  69. // OP_STATE_RENDER size: 4 (sizeof D3DINSTRUCTION)
  70. #define OP_STATE_RENDER(cnt, ptr) \
  71.     PUTD3DINSTRUCTION(D3DOP_STATERENDER, sizeof(D3DSTATE), cnt, ptr)
  72.  
  73. // STATE_DATA size: 8 (sizeof D3DSTATE)
  74. #define STATE_DATA(type, arg, ptr) \
  75. (   ((LPD3DSTATE) ptr)->drstRenderStateType = (D3DRENDERSTATETYPE)type, \
  76.     ((LPD3DSTATE) ptr)->dwArg[0] = arg, \
  77.     ptr = (void *)(((LPD3DSTATE) ptr) + 1) \
  78. )
  79.  
  80. // OP_PROCESS_VERTICES size: 4 (sizeof D3DINSTRUCTION)
  81. #define OP_PROCESS_VERTICES(cnt, ptr) \
  82.     PUTD3DINSTRUCTION(D3DOP_PROCESSVERTICES, sizeof(D3DPROCESSVERTICES), cnt, ptr)
  83.  
  84. // PROCESSVERTICES_DATA size: 16 (sizeof D3DPROCESSVERTICES)
  85. #define PROCESSVERTICES_DATA(flgs, strt, cnt, ptr) \
  86. (   ((LPD3DPROCESSVERTICES) ptr)->dwFlags = flgs, \
  87.     ((LPD3DPROCESSVERTICES) ptr)->wStart = strt, \
  88.     ((LPD3DPROCESSVERTICES) ptr)->wDest = strt, \
  89.     ((LPD3DPROCESSVERTICES) ptr)->dwCount = cnt, \
  90.     ((LPD3DPROCESSVERTICES) ptr)->dwReserved = 0, \
  91.     ptr = (void *)(((LPD3DPROCESSVERTICES) ptr) + 1) \
  92. )
  93.  
  94. // OP_TRIANGLE_LIST size: 4 (sizeof D3DINSTRUCTION)
  95. #define OP_TRIANGLE_LIST(cnt, ptr) \
  96.     PUTD3DINSTRUCTION(D3DOP_TRIANGLE, sizeof(D3DTRIANGLE), cnt, ptr)
  97.  
  98. #define TRIANGLE_LIST_DATA(loc, count, ptr) \
  99. (   ((ptr) != (loc))? memcpy((ptr), (loc), sizeof(D3DTRIANGLE) * (count)) : 0, \
  100.     ptr = (void *)(((LPD3DTRIANGLE) (ptr)) + (count)) \
  101. )
  102.  
  103. // OP_TRIANGLEEX_LIST size: 4 (sizeof D3DINSTRUCTION)
  104. #define OP_TRIANGLEEX_LIST(cnt, ptr) \
  105.     PUTD3DINSTRUCTION(D3DOP_TRIANGLEEX, sizeof(D3DTRIANGLEEX), cnt, ptr)
  106.  
  107. #define TRIANGLEEX_LIST_DATA(loc, count, ptr) \
  108. (   ((ptr) != (loc))? memcpy((ptr), (loc), sizeof(D3DTRIANGLEEX) * (count)) : 0, \
  109.     ptr = (void *)(((LPD3DTRIANGLEEX) (ptr)) + (count)) \
  110. )
  111.  
  112. // OP_LINE_LIST size: 4 (sizeof D3DINSTRUCTION)
  113. #define OP_LINE_LIST(cnt, ptr) \
  114.     PUTD3DINSTRUCTION(D3DOP_LINE, sizeof(D3DLINE), cnt, ptr)
  115.  
  116. #define LINE_LIST_DATA(loc, count, ptr) \
  117. (   ((ptr) != (loc))? memcpy((ptr), (loc), sizeof(D3DLINE) * (count)) : 0, \
  118.     ptr = (void *)(((LPD3DLINE) (ptr)) + (count)) \
  119. )
  120.  
  121. // OP_POINT_LIST size: 8 (sizeof D3DINSTRUCTION + sizeof D3DPOINT)
  122. #define OP_POINT_LIST(first, cnt, ptr) \
  123. (   PUTD3DINSTRUCTION(D3DOP_POINT, sizeof(D3DPOINT), 1, ptr), \
  124.     ((LPD3DPOINT)(ptr))->wCount = cnt, \
  125.     ((LPD3DPOINT)(ptr))->wFirst = first, \
  126.     ptr = (void*)(((LPD3DPOINT)(ptr)) + 1) \
  127. )
  128.  
  129. // OP_SPAN_LIST size: 8 (sizeof D3DINSTRUCTION + sizeof D3DSPAN)
  130. #define OP_SPAN_LIST(first, cnt, ptr) \
  131. (   PUTD3DINSTRUCTION(D3DOP_SPAN, sizeof(D3DSPAN), 1, ptr), \
  132.     ((LPD3DSPAN)(ptr))->wCount = cnt, \
  133.     ((LPD3DSPAN)(ptr))->wFirst = first, \
  134.     ptr = (void*)(((LPD3DSPAN)(ptr)) + 1) \
  135. )
  136.  
  137. // OP_BRANCH_FORWARD size: 18 (sizeof D3DINSTRUCTION + sizeof D3DBRANCH)
  138. #define OP_BRANCH_FORWARD(tmask, tvalue, tnegate, toffset, ptr) \
  139. (   PUTD3DINSTRUCTION(D3DOP_BRANCHFORWARD, sizeof(D3DBRANCH), 1, ptr), \
  140.     ((LPD3DBRANCH) ptr)->dwMask = tmask, \
  141.     ((LPD3DBRANCH) ptr)->dwValue = tvalue, \
  142.     ((LPD3DBRANCH) ptr)->bNegate = tnegate, \
  143.     ((LPD3DBRANCH) ptr)->dwOffset = toffset, \
  144.     ptr = (void *)(((LPD3DBRANCH) (ptr)) + 1) \
  145. )
  146.  
  147. // OP_SET_STATUS size: 20 (sizeof D3DINSTRUCTION + sizeof D3DSTATUS)
  148. #define OP_SET_STATUS(flags, status, _x1, _y1, _x2, _y2, ptr) \
  149. (   PUTD3DINSTRUCTION(D3DOP_SETSTATUS, sizeof(D3DSTATUS), 1, ptr), \
  150.     ((LPD3DSTATUS)(ptr))->dwFlags = flags, \
  151.     ((LPD3DSTATUS)(ptr))->dwStatus = status, \
  152.     ((LPD3DSTATUS)(ptr))->drExtent.x1 = _x1, \
  153.     ((LPD3DSTATUS)(ptr))->drExtent.y1 = _y1, \
  154.     ((LPD3DSTATUS)(ptr))->drExtent.x2 = _x2, \
  155.     ((LPD3DSTATUS)(ptr))->drExtent.y2 = _y2, \
  156.     ptr = (void *)(((LPD3DSTATUS) (ptr)) + 1) \
  157. )
  158.  
  159. // OP_NOP size: 4
  160. #define OP_NOP(ptr) \
  161.     PUTD3DINSTRUCTION(D3DOP_TRIANGLE, sizeof(D3DTRIANGLE), 0, ptr)
  162.  
  163. #define OP_EXIT(ptr) \
  164.     PUTD3DINSTRUCTION(D3DOP_EXIT, 0, 0, ptr)
  165.  
  166. #define QWORD_ALIGNED(ptr) \
  167.     !(0x00000007L & (ULONG)(ptr))
  168.  
  169. #endif // __D3DMACS_H__
  170.