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 / tri3 / triangle.c < prev   
C/C++ Source or Header  |  1997-07-14  |  8KB  |  238 lines

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: triangle.c
  6.  *
  7.  ***************************************************************************/
  8.  
  9. #include <math.h>
  10. #include <d3d.h>
  11. #include "d3ddemo.h"
  12.  
  13. LPDIRECT3DMATERIAL2 lpBmat, lpMat1;
  14. #define NUM_SQUARESTRIP 50
  15. #define NUM_VERTICES (4 + (NUM_SQUARESTRIP + 1) * 2)
  16. #define NUM_TRIANGLES 1
  17. #define NUM_TSTRIPIDX ((NUM_SQUARESTRIP + 1) * 2 )
  18. #define NUM_TFANIDX (NUM_TSTRIPIDX + 1)
  19. #define NUM_INDICES (NUM_TSTRIPIDX + NUM_TFANIDX)
  20. D3DTLVERTEX src_v[NUM_VERTICES];
  21. WORD src_t[NUM_INDICES];
  22. DWORD hTex;
  23. DWORD hMat;
  24.  
  25. void CreateGridStrip(int x)
  26. {
  27. }
  28.  
  29. void
  30. OverrideDefaults(Defaults* defaults)
  31. {
  32.     lstrcpy(defaults->Name, "Triangle D3D Example");
  33.     defaults->rs.bPerspCorrect = FALSE;
  34.     defaults->bResizingDisabled = FALSE;
  35. }
  36.  
  37. BOOL
  38. RenderScene(LPDIRECT3DDEVICE2 lpDev, LPDIRECT3DVIEWPORT2 lpView,
  39.             LPD3DRECT lpExtent)
  40. {
  41.     LPD3DTLVERTEX tstrip_v = src_v+3;
  42.         D3DCLIPSTATUS status={D3DCLIPSTATUS_EXTENTS2, 0, 2048.0f, 0.0f, 2048.0f, 0.0f, 0.0f, 0.0f};
  43.  
  44.     if (lpDev->lpVtbl->BeginScene(lpDev) != D3D_OK)
  45.         return FALSE;
  46.     if (lpDev->lpVtbl->SetLightState(lpDev, D3DLIGHTSTATE_MATERIAL, hMat) != D3D_OK)
  47.         return FALSE; 
  48.     if (lpDev->lpVtbl->SetRenderState(lpDev, D3DRENDERSTATE_TEXTUREHANDLE, hTex) != D3D_OK)
  49.         return FALSE; 
  50.     if (lpDev->lpVtbl->SetClipStatus(lpDev, &status) != D3D_OK)
  51.         return FALSE; 
  52. /*    if (lpDev->lpVtbl->DrawIndexedPrimitive(lpDev, D3DPT_TRIANGLELIST, 
  53.                        D3DVT_TLVERTEX, (LPVOID)src_v, 3, (LPWORD)src_t, 
  54.                                            NUM_TRIANGLES*3, D3DDP_WAIT) != D3D_OK)
  55.         return FALSE;
  56.     if (lpDev->lpVtbl->DrawIndexedPrimitive(lpDev, D3DPT_TRIANGLESTRIP, 
  57.                        D3DVT_TLVERTEX, (LPVOID)tstrip_v, NUM_TSTRIPIDX, (LPWORD)src_t, 
  58.                                            NUM_TSTRIPIDX, D3DDP_WAIT) != D3D_OK)
  59.         return FALSE;
  60.     if (lpDev->lpVtbl->DrawIndexedPrimitive(lpDev, D3DPT_TRIANGLEFAN, 
  61.                        D3DVT_TLVERTEX, (LPVOID)tstrip_v, NUM_TSTRIPIDX + 1, (LPWORD)src_t + NUM_TSTRIPIDX, 
  62.                                            NUM_TFANIDX, D3DDP_WAIT) != D3D_OK)
  63.         return FALSE;*/
  64.     if (lpDev->lpVtbl->DrawPrimitive(lpDev, D3DPT_TRIANGLEFAN, 
  65.                                            D3DVT_TLVERTEX, (LPVOID)tstrip_v, NUM_TSTRIPIDX, D3DDP_WAIT) != D3D_OK)
  66.         return FALSE;
  67. /*    if (lpDev->lpVtbl->DrawPrimitive(lpDev, D3DPT_TRIANGLESTRIP, 
  68.                                            D3DVT_TLVERTEX, (LPVOID)tstrip_v, NUM_TSTRIPIDX, D3DDP_WAIT) != D3D_OK)
  69.         return FALSE;
  70.     if (lpDev->lpVtbl->DrawPrimitive(lpDev, D3DPT_TRIANGLELIST, 
  71.                                            D3DVT_TLVERTEX, (LPVOID)src_v, 3, D3DDP_WAIT) != D3D_OK)
  72.         return FALSE;*/
  73.     if (lpDev->lpVtbl->GetClipStatus(lpDev, &status) != D3D_OK)
  74.         return FALSE; 
  75.     if (lpDev->lpVtbl->EndScene(lpDev) != D3D_OK)
  76.         return FALSE;
  77.     lpExtent->x1 = (LONG)floor((double)status.minx);
  78.     lpExtent->x2 = (LONG)ceil((double)status.maxx);
  79.     lpExtent->y1 = (LONG)floor((double)status.miny);
  80.     lpExtent->y2 = (LONG)ceil((double)status.maxy);
  81.     return TRUE;
  82. }
  83.  
  84. void
  85. ReleaseScene(void)
  86. {
  87.     return;
  88. }
  89.  
  90. void
  91. ReleaseView(LPDIRECT3DVIEWPORT2 lpView)
  92. {
  93.     lpView;
  94.     RELEASE(lpMat1);
  95.     RELEASE(lpBmat);
  96. }
  97.  
  98. BOOL
  99. InitScene(void)
  100. {
  101.     int i;
  102.     LPD3DTLVERTEX tstrip_v = src_v+3;
  103.  
  104.     /*
  105.      * Setup vertices for single triangle
  106.      */
  107.     memset(&src_v[0], 0, sizeof(D3DVERTEX) * NUM_VERTICES);
  108.     src_v[0].sx = D3DVAL(10.0);
  109.     src_v[0].sy = D3DVAL(10.0);
  110.     src_v[0].sz = D3DVAL(0.1);
  111.     src_v[0].rhw = D3DVAL(1.0);
  112.     src_v[0].color = RGBA_MAKE(255, 0, 255, 255);
  113.     src_v[0].specular = RGB_MAKE(0, 0, 255);
  114.     src_v[0].tu = D3DVAL(0.0);
  115.     src_v[0].tv = D3DVAL(0.0);
  116.     src_v[1].sx = D3DVAL(300.0);
  117.     src_v[1].sy = D3DVAL(50.0);
  118.     src_v[1].sz = D3DVAL(0.9);
  119.     src_v[1].rhw = D3DVAL(2.0);
  120.     src_v[1].color = RGBA_MAKE(255, 255, 255, 255);
  121.     src_v[1].specular = RGB_MAKE(0, 0, 0);
  122.     src_v[1].tu = D3DVAL(1.0);
  123.     src_v[1].tv = D3DVAL(1.0);
  124.     src_v[2].sx = D3DVAL(150.0);
  125.     src_v[2].sy = D3DVAL(180.0);
  126.     src_v[2].sz = D3DVAL(0.6);
  127.     src_v[2].rhw = D3DVAL(1.0);
  128.     src_v[2].color = RGBA_MAKE(255, 255, 0, 255);
  129.     src_v[2].specular = RGB_MAKE(0, 0, 0);
  130.     src_v[2].tu = D3DVAL(0.0);
  131.     src_v[2].tv = D3DVAL(1.0);
  132.  
  133.     /*
  134.      * Setup vertices for triangle strip
  135.      */
  136.     for (i=0; i<=NUM_SQUARESTRIP; ++i)
  137.     {
  138.         tstrip_v[i*2].sx = i*300.0f/NUM_SQUARESTRIP;
  139.         tstrip_v[i*2].sy = 200.0f;
  140.         tstrip_v[i*2].sz = .5f;
  141.         tstrip_v[i*2].rhw = 1.0f;
  142.         tstrip_v[i*2].color = RGBA_MAKE(255, 255, 255, 255);
  143.         tstrip_v[i*2].specular = RGB_MAKE(0, 0, 0);
  144.         tstrip_v[i*2].tu = (float)i/NUM_SQUARESTRIP;
  145.         tstrip_v[i*2].tv = 0.0f;
  146.         tstrip_v[i*2+1].sx = i*300.0f/NUM_SQUARESTRIP;
  147.         tstrip_v[i*2+1].sy = 0.0f;
  148.         tstrip_v[i*2+1].sz = .5f;
  149.         tstrip_v[i*2+1].rhw = 1.0f;
  150.         tstrip_v[i*2+1].color = RGBA_MAKE(255, 255, 255, 255);
  151.         tstrip_v[i*2+1].specular = RGB_MAKE(0, 0, 0);
  152.         tstrip_v[i*2+1].tu = (float)i/NUM_SQUARESTRIP;
  153.         tstrip_v[i*2+1].tv = 1.0f;
  154.     }
  155.     /* Set up base vertex for trifan */
  156.     tstrip_v[i*2].sx = 0.0f;
  157.     tstrip_v[i*2].sy = 100.0f;
  158.     tstrip_v[i*2].sz = .5f;
  159.     tstrip_v[i*2].rhw = 1.0f;
  160.     tstrip_v[i*2].color = RGBA_MAKE(255, 255, 255, 255);
  161.     tstrip_v[i*2].specular = RGB_MAKE(0, 0, 0);
  162.     tstrip_v[i*2].tu = 0.0f;
  163.     tstrip_v[i*2].tv = 0.5f;
  164.  
  165.     /*
  166.      * Set Up Triangle strip indices & base Tri Fan index
  167.      */
  168.     for (i=0; i<=NUM_TSTRIPIDX; ++i)
  169.         src_t[i]=i;
  170.     /*
  171.      * Set Up Triangle fan indices
  172.      */
  173.     for (i=0; i<=NUM_SQUARESTRIP; ++i)
  174.     {
  175.         src_t[NUM_TSTRIPIDX+1+i]=i*2+1;
  176.         src_t[NUM_INDICES-1-i]=i*2;
  177.     }
  178.     return TRUE;
  179. }
  180.  
  181. BOOL
  182. InitView(LPDIRECTDRAW lpDD, LPDIRECT3D2 lpD3D, LPDIRECT3DDEVICE2 lpDev,
  183.        LPDIRECT3DVIEWPORT2 lpView, int NumTextures,
  184.        LPD3DTEXTUREHANDLE TextureHandle)
  185. {
  186.     D3DMATERIAL bmat, mat;
  187.     D3DMATERIALHANDLE hBmat, hMat1;
  188.  
  189.     if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpBmat, NULL) != D3D_OK) {
  190.     return FALSE;
  191.     }
  192.     memset(&bmat, 0, sizeof(D3DMATERIAL));
  193.     bmat.dwSize = sizeof(D3DMATERIAL);
  194.     bmat.diffuse.r = (D3DVALUE)1.0;
  195.     bmat.diffuse.g = (D3DVALUE)1.0;
  196.     bmat.diffuse.b = (D3DVALUE)1.0;
  197.     bmat.ambient.r = (D3DVALUE)1.0;
  198.     bmat.ambient.g = (D3DVALUE)1.0;
  199.     bmat.ambient.b = (D3DVALUE)1.0;
  200.     bmat.hTexture = TextureHandle[0];
  201.     bmat.dwRampSize = 1;
  202.     lpBmat->lpVtbl->SetMaterial(lpBmat, &bmat);
  203.     lpBmat->lpVtbl->GetHandle(lpBmat, lpDev, &hBmat);
  204.     lpView->lpVtbl->SetBackground(lpView, hBmat);
  205.  
  206.     if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpMat1, NULL) != D3D_OK) {
  207.     return FALSE;
  208.     }
  209.     memset(&mat, 0, sizeof(D3DMATERIAL));
  210.     mat.dwSize = sizeof(D3DMATERIAL);
  211.     mat.diffuse.r = (D3DVALUE)1.0;
  212.     mat.diffuse.g = (D3DVALUE)1.0;
  213.     mat.diffuse.b = (D3DVALUE)1.0;
  214.     mat.ambient.r = (D3DVALUE)1.0;
  215.     mat.ambient.g = (D3DVALUE)1.0;
  216.     mat.ambient.b = (D3DVALUE)1.0;
  217. #define SPECULAR
  218. #ifdef SPECULAR
  219.     mat.specular.r = (D3DVALUE)1.0;
  220.     mat.specular.g = (D3DVALUE)1.0;
  221.     mat.specular.b = (D3DVALUE)1.0;
  222.     mat.power = (float)40.0;
  223. #else
  224.     mat.specular.r = (D3DVALUE)0.0;
  225.     mat.specular.g = (D3DVALUE)0.0;
  226.     mat.specular.b = (D3DVALUE)0.0;
  227.     mat.power = (float)0.0;
  228. #endif    
  229.     mat.hTexture = TextureHandle[1];
  230.     mat.dwRampSize = 16;
  231.     lpMat1->lpVtbl->SetMaterial(lpMat1, &mat);
  232.     lpMat1->lpVtbl->GetHandle(lpMat1, lpDev, &hMat1);
  233.     hMat= (DWORD) hMat1;
  234.     hTex=TextureHandle[1];
  235.     return TRUE;
  236. }
  237.  
  238.