MORPH.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

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