home *** CD-ROM | disk | FTP | other *** search
- /*==========================================================================
- *
- * Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
- *
- * File: triangle.c
- *
- ***************************************************************************/
-
- #include <math.h>
- #include <d3d.h>
- #include "d3ddemo.h"
-
- LPDIRECT3DMATERIAL2 lpBmat, lpMat1;
- #define NUM_SQUARESTRIP 50
- #define NUM_VERTICES (4 + (NUM_SQUARESTRIP + 1) * 2)
- #define NUM_TRIANGLES 1
- #define NUM_TSTRIPIDX ((NUM_SQUARESTRIP + 1) * 2 )
- #define NUM_TFANIDX (NUM_TSTRIPIDX + 1)
- #define NUM_INDICES (NUM_TSTRIPIDX + NUM_TFANIDX)
- D3DTLVERTEX src_v[NUM_VERTICES];
- WORD src_t[NUM_INDICES];
- DWORD hTex;
- DWORD hMat;
-
- void CreateGridStrip(int x)
- {
- }
-
- void
- OverrideDefaults(Defaults* defaults)
- {
- lstrcpy(defaults->Name, "Triangle D3D Example");
- defaults->rs.bPerspCorrect = FALSE;
- defaults->bResizingDisabled = FALSE;
- }
-
- BOOL
- RenderScene(LPDIRECT3DDEVICE2 lpDev, LPDIRECT3DVIEWPORT2 lpView,
- LPD3DRECT lpExtent)
- {
- LPD3DTLVERTEX tstrip_v = src_v+3;
- D3DCLIPSTATUS status={D3DCLIPSTATUS_EXTENTS2, 0, 2048.0f, 0.0f, 2048.0f, 0.0f, 0.0f, 0.0f};
-
- if (lpDev->lpVtbl->BeginScene(lpDev) != D3D_OK)
- return FALSE;
- if (lpDev->lpVtbl->SetLightState(lpDev, D3DLIGHTSTATE_MATERIAL, hMat) != D3D_OK)
- return FALSE;
- if (lpDev->lpVtbl->SetRenderState(lpDev, D3DRENDERSTATE_TEXTUREHANDLE, hTex) != D3D_OK)
- return FALSE;
- if (lpDev->lpVtbl->SetClipStatus(lpDev, &status) != D3D_OK)
- return FALSE;
- /* if (lpDev->lpVtbl->DrawIndexedPrimitive(lpDev, D3DPT_TRIANGLELIST,
- D3DVT_TLVERTEX, (LPVOID)src_v, 3, (LPWORD)src_t,
- NUM_TRIANGLES*3, D3DDP_WAIT) != D3D_OK)
- return FALSE;
- if (lpDev->lpVtbl->DrawIndexedPrimitive(lpDev, D3DPT_TRIANGLESTRIP,
- D3DVT_TLVERTEX, (LPVOID)tstrip_v, NUM_TSTRIPIDX, (LPWORD)src_t,
- NUM_TSTRIPIDX, D3DDP_WAIT) != D3D_OK)
- return FALSE;
- if (lpDev->lpVtbl->DrawIndexedPrimitive(lpDev, D3DPT_TRIANGLEFAN,
- D3DVT_TLVERTEX, (LPVOID)tstrip_v, NUM_TSTRIPIDX + 1, (LPWORD)src_t + NUM_TSTRIPIDX,
- NUM_TFANIDX, D3DDP_WAIT) != D3D_OK)
- return FALSE;*/
- if (lpDev->lpVtbl->DrawPrimitive(lpDev, D3DPT_TRIANGLEFAN,
- D3DVT_TLVERTEX, (LPVOID)tstrip_v, NUM_TSTRIPIDX, D3DDP_WAIT) != D3D_OK)
- return FALSE;
- /* if (lpDev->lpVtbl->DrawPrimitive(lpDev, D3DPT_TRIANGLESTRIP,
- D3DVT_TLVERTEX, (LPVOID)tstrip_v, NUM_TSTRIPIDX, D3DDP_WAIT) != D3D_OK)
- return FALSE;
- if (lpDev->lpVtbl->DrawPrimitive(lpDev, D3DPT_TRIANGLELIST,
- D3DVT_TLVERTEX, (LPVOID)src_v, 3, D3DDP_WAIT) != D3D_OK)
- return FALSE;*/
- if (lpDev->lpVtbl->GetClipStatus(lpDev, &status) != D3D_OK)
- return FALSE;
- if (lpDev->lpVtbl->EndScene(lpDev) != D3D_OK)
- return FALSE;
- lpExtent->x1 = (LONG)floor((double)status.minx);
- lpExtent->x2 = (LONG)ceil((double)status.maxx);
- lpExtent->y1 = (LONG)floor((double)status.miny);
- lpExtent->y2 = (LONG)ceil((double)status.maxy);
- return TRUE;
- }
-
- void
- ReleaseScene(void)
- {
- return;
- }
-
- void
- ReleaseView(LPDIRECT3DVIEWPORT2 lpView)
- {
- lpView;
- RELEASE(lpMat1);
- RELEASE(lpBmat);
- }
-
- BOOL
- InitScene(void)
- {
- int i;
- LPD3DTLVERTEX tstrip_v = src_v+3;
-
- /*
- * Setup vertices for single triangle
- */
- memset(&src_v[0], 0, sizeof(D3DVERTEX) * NUM_VERTICES);
- src_v[0].sx = D3DVAL(10.0);
- src_v[0].sy = D3DVAL(10.0);
- src_v[0].sz = D3DVAL(0.1);
- src_v[0].rhw = D3DVAL(1.0);
- src_v[0].color = RGBA_MAKE(255, 0, 255, 255);
- src_v[0].specular = RGB_MAKE(0, 0, 255);
- src_v[0].tu = D3DVAL(0.0);
- src_v[0].tv = D3DVAL(0.0);
- src_v[1].sx = D3DVAL(300.0);
- src_v[1].sy = D3DVAL(50.0);
- src_v[1].sz = D3DVAL(0.9);
- src_v[1].rhw = D3DVAL(2.0);
- src_v[1].color = RGBA_MAKE(255, 255, 255, 255);
- src_v[1].specular = RGB_MAKE(0, 0, 0);
- src_v[1].tu = D3DVAL(1.0);
- src_v[1].tv = D3DVAL(1.0);
- src_v[2].sx = D3DVAL(150.0);
- src_v[2].sy = D3DVAL(180.0);
- src_v[2].sz = D3DVAL(0.6);
- src_v[2].rhw = D3DVAL(1.0);
- src_v[2].color = RGBA_MAKE(255, 255, 0, 255);
- src_v[2].specular = RGB_MAKE(0, 0, 0);
- src_v[2].tu = D3DVAL(0.0);
- src_v[2].tv = D3DVAL(1.0);
-
- /*
- * Setup vertices for triangle strip
- */
- for (i=0; i<=NUM_SQUARESTRIP; ++i)
- {
- tstrip_v[i*2].sx = i*300.0f/NUM_SQUARESTRIP;
- tstrip_v[i*2].sy = 200.0f;
- tstrip_v[i*2].sz = .5f;
- tstrip_v[i*2].rhw = 1.0f;
- tstrip_v[i*2].color = RGBA_MAKE(255, 255, 255, 255);
- tstrip_v[i*2].specular = RGB_MAKE(0, 0, 0);
- tstrip_v[i*2].tu = (float)i/NUM_SQUARESTRIP;
- tstrip_v[i*2].tv = 0.0f;
- tstrip_v[i*2+1].sx = i*300.0f/NUM_SQUARESTRIP;
- tstrip_v[i*2+1].sy = 0.0f;
- tstrip_v[i*2+1].sz = .5f;
- tstrip_v[i*2+1].rhw = 1.0f;
- tstrip_v[i*2+1].color = RGBA_MAKE(255, 255, 255, 255);
- tstrip_v[i*2+1].specular = RGB_MAKE(0, 0, 0);
- tstrip_v[i*2+1].tu = (float)i/NUM_SQUARESTRIP;
- tstrip_v[i*2+1].tv = 1.0f;
- }
- /* Set up base vertex for trifan */
- tstrip_v[i*2].sx = 0.0f;
- tstrip_v[i*2].sy = 100.0f;
- tstrip_v[i*2].sz = .5f;
- tstrip_v[i*2].rhw = 1.0f;
- tstrip_v[i*2].color = RGBA_MAKE(255, 255, 255, 255);
- tstrip_v[i*2].specular = RGB_MAKE(0, 0, 0);
- tstrip_v[i*2].tu = 0.0f;
- tstrip_v[i*2].tv = 0.5f;
-
- /*
- * Set Up Triangle strip indices & base Tri Fan index
- */
- for (i=0; i<=NUM_TSTRIPIDX; ++i)
- src_t[i]=i;
- /*
- * Set Up Triangle fan indices
- */
- for (i=0; i<=NUM_SQUARESTRIP; ++i)
- {
- src_t[NUM_TSTRIPIDX+1+i]=i*2+1;
- src_t[NUM_INDICES-1-i]=i*2;
- }
- return TRUE;
- }
-
- BOOL
- InitView(LPDIRECTDRAW lpDD, LPDIRECT3D2 lpD3D, LPDIRECT3DDEVICE2 lpDev,
- LPDIRECT3DVIEWPORT2 lpView, int NumTextures,
- LPD3DTEXTUREHANDLE TextureHandle)
- {
- D3DMATERIAL bmat, mat;
- D3DMATERIALHANDLE hBmat, hMat1;
-
- if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpBmat, NULL) != D3D_OK) {
- return FALSE;
- }
- memset(&bmat, 0, sizeof(D3DMATERIAL));
- bmat.dwSize = sizeof(D3DMATERIAL);
- bmat.diffuse.r = (D3DVALUE)1.0;
- bmat.diffuse.g = (D3DVALUE)1.0;
- bmat.diffuse.b = (D3DVALUE)1.0;
- bmat.ambient.r = (D3DVALUE)1.0;
- bmat.ambient.g = (D3DVALUE)1.0;
- bmat.ambient.b = (D3DVALUE)1.0;
- bmat.hTexture = TextureHandle[0];
- bmat.dwRampSize = 1;
- lpBmat->lpVtbl->SetMaterial(lpBmat, &bmat);
- lpBmat->lpVtbl->GetHandle(lpBmat, lpDev, &hBmat);
- lpView->lpVtbl->SetBackground(lpView, hBmat);
-
- if (lpD3D->lpVtbl->CreateMaterial(lpD3D, &lpMat1, NULL) != D3D_OK) {
- return FALSE;
- }
- memset(&mat, 0, sizeof(D3DMATERIAL));
- mat.dwSize = sizeof(D3DMATERIAL);
- mat.diffuse.r = (D3DVALUE)1.0;
- mat.diffuse.g = (D3DVALUE)1.0;
- mat.diffuse.b = (D3DVALUE)1.0;
- mat.ambient.r = (D3DVALUE)1.0;
- mat.ambient.g = (D3DVALUE)1.0;
- mat.ambient.b = (D3DVALUE)1.0;
- #define SPECULAR
- #ifdef SPECULAR
- mat.specular.r = (D3DVALUE)1.0;
- mat.specular.g = (D3DVALUE)1.0;
- mat.specular.b = (D3DVALUE)1.0;
- mat.power = (float)40.0;
- #else
- mat.specular.r = (D3DVALUE)0.0;
- mat.specular.g = (D3DVALUE)0.0;
- mat.specular.b = (D3DVALUE)0.0;
- mat.power = (float)0.0;
- #endif
- mat.hTexture = TextureHandle[1];
- mat.dwRampSize = 16;
- lpMat1->lpVtbl->SetMaterial(lpMat1, &mat);
- lpMat1->lpVtbl->GetHandle(lpMat1, lpDev, &hMat1);
- hMat= (DWORD) hMat1;
- hTex=TextureHandle[1];
- return TRUE;
- }
-
-