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 / morph / morph.cpp < prev    next >
C/C++ Source or Header  |  1997-07-14  |  7KB  |  204 lines

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: morph.c
  6.  *
  7.  ***************************************************************************/
  8.  
  9. /*
  10.  * An example of the use of interpolators.
  11.  */
  12.  
  13. #include "rmdemo.h"
  14.  
  15. #define NO_NORMAL {D3DVAL(0), D3DVAL(0), D3DVAL(0)}, D3DVAL(0), D3DVAL(0), 0
  16.  
  17. /* cube corners */
  18. #define CFTL(v)    {{-D3DVAL(v), +D3DVAL(v), -D3DVAL(v)}, NO_NORMAL}
  19. #define CFTR(v)    {{+D3DVAL(v), +D3DVAL(v), -D3DVAL(v)}, NO_NORMAL}
  20. #define CFBR(v)    {{+D3DVAL(v), -D3DVAL(v), -D3DVAL(v)}, NO_NORMAL}
  21. #define CFBL(v)    {{-D3DVAL(v), -D3DVAL(v), -D3DVAL(v)}, NO_NORMAL}
  22. #define CBTL(v)    {{-D3DVAL(v), +D3DVAL(v), +D3DVAL(v)}, NO_NORMAL}
  23. #define CBTR(v)    {{+D3DVAL(v), +D3DVAL(v), +D3DVAL(v)}, NO_NORMAL}
  24. #define CBBR(v)    {{+D3DVAL(v), -D3DVAL(v), +D3DVAL(v)}, NO_NORMAL}
  25. #define CBBL(v)    {{-D3DVAL(v), -D3DVAL(v), +D3DVAL(v)}, NO_NORMAL}
  26.  
  27. /* face centers */
  28. #define FRT(v)    {{ D3DVAL(0),  D3DVAL(0), -D3DVAL(v)}, NO_NORMAL}
  29. #define BCK(v)    {{ D3DVAL(0),  D3DVAL(0),  D3DVAL(v)}, NO_NORMAL}
  30. #define BTM(v)    {{ D3DVAL(0), -D3DVAL(v),  D3DVAL(0)}, NO_NORMAL}
  31. #define TOP(v)    {{ D3DVAL(0),  D3DVAL(v),  D3DVAL(0)}, NO_NORMAL}
  32. #define LFT(v)    {{-D3DVAL(v),  D3DVAL(0),  D3DVAL(0)}, NO_NORMAL}
  33. #define RGT(v)    {{ D3DVAL(v),  D3DVAL(0),  D3DVAL(0)}, NO_NORMAL}
  34.  
  35.  
  36. D3DRMVERTEX verts0[] =
  37. {   CFTL(1), CFTR(1), CFBR(1), CFBL(1),
  38.     CBBR(1), CBTR(1), CBTL(1), CBBL(1),
  39.     CFBR(1), CBBR(1), CBBL(1), CFBL(1),
  40.     CBTL(1), CBTR(1), CFTR(1), CFTL(1),
  41.     CBTL(1), CFTL(1), CFBL(1), CBBL(1),
  42.     CFBR(1), CFTR(1), CBTR(1), CBBR(1),
  43.     FRT(5), BCK(5), BTM(5), TOP(5), LFT(5), RGT(5)
  44. };
  45.  
  46. D3DRMVERTEX verts1[] =
  47. {   CFTL(2), CFTR(2), CFBR(2), CFBL(2),
  48.     CBBR(2), CBTR(2), CBTL(2), CBBL(2),
  49.     CFBR(2), CBBR(2), CBBL(2), CFBL(2),
  50.     CBTL(2), CBTR(2), CFTR(2), CFTL(2),
  51.     CBTL(2), CFTL(2), CFBL(2), CBBL(2),
  52.     CFBR(2), CFTR(2), CBTR(2), CBBR(2),
  53.     FRT(1), BCK(1), BTM(1), TOP(1), LFT(1), RGT(1)
  54. };
  55.  
  56. unsigned faces[] =
  57. {    0,  1, 24,  1,  2, 24,  2,  3, 24,  3,  0, 24,
  58.      4,  5, 25,  5,  6, 25,  6,  7, 25,  7,  4, 25,
  59.      8,  9, 26,  9, 10, 26, 10, 11, 26, 11,  8, 26,
  60.     12, 13, 27, 13, 14, 27, 14, 15, 27, 15, 12, 27,
  61.     16, 17, 28, 17, 18, 28, 18, 19, 28, 19, 16, 28,
  62.     20, 21, 29, 21, 22, 29, 22, 23, 29, 23, 20, 29
  63. };
  64.  
  65. static void CDECL destroyInterp(LPDIRECT3DRMOBJECT obj, void* arg)
  66. {
  67.     LPDIRECT3DRMINTERPOLATOR meshInterp = (LPDIRECT3DRMINTERPOLATOR) arg;
  68.  
  69.     if (meshInterp) meshInterp->Release();
  70. }
  71.  
  72. void CDECL 
  73. interpolate(LPDIRECT3DRMFRAME frame, void *arg, D3DVALUE delta)
  74. {
  75.     static D3DVALUE val = D3DVAL(0);
  76.     LPDIRECT3DRMINTERPOLATOR meshInterp = (LPDIRECT3DRMINTERPOLATOR) arg;
  77.  
  78.     meshInterp->Interpolate(val += delta, NULL, D3DRMINTERPOLATION_CLOSED | D3DRMINTERPOLATION_LINEAR);
  79. }
  80.  
  81. void generate_normals(D3DRMVERTEX verts[])
  82. {
  83.     unsigned i;
  84.     D3DVECTOR a, b;
  85.  
  86.     for (i = 0; i < 24; i++)
  87.     {
  88.     D3DRMVectorSubtract(&a, &verts[faces[i * 3 + 1]].position, &verts[i].position);
  89.     D3DRMVectorSubtract(&b, &verts[faces[i * 3 + 2]].position, &verts[i].position);
  90.     D3DRMVectorCrossProduct(&verts[i].normal, &a, &b);
  91.     D3DRMVectorNormalize(&verts[i].normal);
  92.     }
  93. }
  94.  
  95. #define D3DTRY(x) if (FAILED(x)) goto generic_error
  96.  
  97. #define CREATE(type, obj) CreateObject(CLSID_C##type, NULL, IID_I##type, (void **) obj)
  98.  
  99. BOOL
  100. BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view,
  101.        LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera)
  102. {
  103.     LPDIRECT3DRMMESH mesh = NULL, meshProxy = NULL;
  104.     LPDIRECT3DRMFRAME frame = NULL, proxyFrame = NULL;
  105.     LPDIRECT3DRMFRAME axis = NULL;
  106.     LPDIRECT3DRMFRAME orbit = NULL;
  107.     LPDIRECT3DRMLIGHT light1 = NULL;
  108.     LPDIRECT3DRMLIGHT light2 = NULL;
  109.     LPDIRECT3DRMINTERPOLATOR meshInterp = NULL;
  110.  
  111.     dev, view, camera;
  112.  
  113.     /* generate flat-shading normals for faces */
  114.     generate_normals(verts0);
  115.     generate_normals(verts1);
  116.  
  117.     D3DTRY(lpD3DRM->CreateObject(CLSID_CDirect3DRMMeshInterpolator, NULL, 
  118.                  IID_IDirect3DRMInterpolator, (void **) &meshInterp));
  119.     D3DTRY(meshInterp->QueryInterface(IID_IDirect3DRMMesh, (void **) &meshProxy));
  120.  
  121.     D3DTRY(meshInterp->SetIndex(D3DVAL(0)));
  122.     D3DTRY(meshProxy->SetVertices(0, 0, 30, verts1));
  123.     D3DTRY(meshProxy->SetGroupColorRGB(0, D3DVAL(0.5), D3DVAL(0.4), D3DVAL(0.7)));
  124.  
  125.     D3DTRY(meshInterp->SetIndex(D3DVAL(25)));
  126.     D3DTRY(meshProxy->SetVertices(0, 0, 30, verts0));
  127.     D3DTRY(meshProxy->SetGroupColorRGB(0, D3DVAL(1), D3DVAL(0.0), D3DVAL(0.3)));
  128.  
  129.     D3DTRY(meshInterp->SetIndex(D3DVAL(40)));
  130.     D3DTRY(meshProxy->SetGroupColorRGB(0, D3DVAL(0.6), D3DVAL(0.6), D3DVAL(0.6)));
  131.  
  132.     D3DTRY(meshInterp->SetIndex(D3DVAL(75)));
  133.     meshProxy->Release();
  134.  
  135.     D3DTRY(lpD3DRM->CREATE(Direct3DRMLight, &light1));
  136.     D3DTRY(light1->SetType(D3DRMLIGHT_AMBIENT));
  137.     D3DTRY(light1->SetColorRGB(D3DVAL(0.2), D3DVAL(0.2), D3DVAL(0.2)));
  138.  
  139.     D3DTRY(lpD3DRM->CREATE(Direct3DRMLight, &light2));
  140.     D3DTRY(light2->SetType(D3DRMLIGHT_DIRECTIONAL));
  141.     D3DTRY(light2->SetColorRGB(D3DVAL(1), D3DVAL(1), D3DVAL(1)));
  142.  
  143.     D3DTRY(scene->AddLight(light1));
  144.     D3DTRY(scene->SetSceneBackgroundRGB(D3DVAL(0.3), D3DVAL(0.6), D3DVAL(0.3)));
  145.  
  146.     D3DTRY(lpD3DRM->CREATE(Direct3DRMFrame, &frame));
  147.     D3DTRY(scene->AddChild(frame));
  148.     D3DTRY(frame->SetOrientation(scene, D3DVAL(0.5), -D3DVAL(0.5), D3DVAL(1),
  149.                  D3DVAL(0), D3DVAL(1), D3DVAL(0)));
  150.  
  151.     D3DTRY(frame->AddLight(light2));
  152.     frame->Release();
  153.  
  154.     D3DTRY(lpD3DRM->CREATE(Direct3DRMFrame, &frame));
  155.     D3DTRY(scene->AddChild(frame));
  156.     D3DTRY(frame->SetPosition(scene, D3DVAL(0), D3DVAL(0), D3DVAL(15)));
  157.     D3DTRY(frame->SetOrientation(scene, D3DVAL(0), D3DVAL(1.0), D3DVAL(0),
  158.                         D3DVAL(0), D3DVAL(0), D3DVAL(1)));
  159.     D3DTRY(frame->SetRotation(scene, D3DVAL(0), D3DVAL(0.9), D3DVAL(1.0), D3DVAL(0.04)));
  160.  
  161.     D3DTRY(lpD3DRM->CREATE(Direct3DRMMesh, &mesh));
  162.     D3DTRY(mesh->AddGroup(30, 24, 3, faces, NULL));
  163.     D3DTRY(mesh->SetGroupQuality(0, D3DRMRENDER_FLAT));
  164.  
  165.     D3DTRY(meshInterp->AttachObject(mesh));
  166.     D3DTRY(frame->AddVisual(mesh));
  167.  
  168.     D3DTRY(frame->AddMoveCallback(interpolate, meshInterp));
  169.     D3DTRY(frame->AddDestroyCallback(destroyInterp, meshInterp));
  170.  
  171.     D3DTRY(lpD3DRM->CREATE(Direct3DRMFrame, &axis));
  172.     D3DTRY(frame->AddChild(axis));
  173.     D3DTRY(axis->SetRotation(frame, D3DVAL(0), D3DVAL(1), D3DVAL(0), D3DVAL(0.04)));
  174.  
  175.     D3DTRY(lpD3DRM->CREATE(Direct3DRMFrame, &orbit));
  176.     D3DTRY(axis->AddChild(orbit));
  177.     D3DTRY(orbit->SetPosition(axis, D3DVAL(2.6), D3DVAL(0), D3DVAL(0)));
  178.  
  179.     RELEASE(mesh);
  180.     RELEASE(frame);
  181.     RELEASE(axis);
  182.     RELEASE(orbit);
  183.     RELEASE(light1);
  184.     RELEASE(light2);
  185.     /* don't release the wrap */
  186.     return TRUE;
  187. generic_error:
  188.     Msg("A failure occurred while building the scene.\n");
  189.     RELEASE(mesh);
  190.     RELEASE(frame);
  191.     RELEASE(axis);
  192.     RELEASE(orbit);
  193.     RELEASE(light1);
  194.     RELEASE(light2);
  195.     return FALSE;
  196. }
  197.  
  198. void
  199. OverrideDefaults(Defaults* defaults)
  200. {
  201.     defaults->bConstRenderQuality = TRUE;
  202.     lstrcpy(defaults->Name, "Interpolator Direct3DRM Example");
  203. }
  204.