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

Windows编程

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: hier1.c
  6.  *
  7.  ***************************************************************************/
  8. /*
  9.  * RL Tutorial program 2 frame hierarchy
  10.  */
  11. #include "rmdemo.h"
  12. BOOL
  13. BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view,
  14.    LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera)
  15. {
  16.     D3DRMRENDERQUALITY quality = D3DRMRENDER_FLAT;
  17.     LPDIRECT3DRMFRAME lights = NULL;
  18.     LPDIRECT3DRMFRAME axis = NULL;
  19.     LPDIRECT3DRMMESH torus_mesh = NULL;
  20.     LPDIRECT3DRMMESH sphere_mesh = NULL;
  21.     LPDIRECT3DRMFRAME torus = NULL;
  22.     LPDIRECT3DRMFRAME sphere = NULL;
  23.     LPDIRECT3DRMLIGHT lp = NULL;
  24.     LPDIRECT3DRMLIGHT la = NULL;
  25.     LPDIRECT3DRMMESHBUILDER builder = NULL;
  26.     HRESULT rval;
  27.     view = view; /* not used */
  28.     /*
  29.      * This Demo shows a simple hierarchy of frames
  30.      */
  31.     if (FAILED(dev->lpVtbl->SetQuality(dev, quality)))
  32. goto generic_error;
  33.     /*
  34.      * initialize the lights in the scene
  35.      */
  36.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &lights)))
  37. goto generic_error;
  38.     if (FAILED(lights->lpVtbl->SetPosition(lights, scene, D3DVAL(5), D3DVAL(5), 
  39.                                 -D3DVAL(9))))
  40. goto generic_error;
  41.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_POINT, D3DVAL(0.9), 
  42.                                   D3DVAL(0.8), D3DVAL(0.7), &lp)))
  43.   goto generic_error;
  44.     if (FAILED(lights->lpVtbl->AddLight(lights, lp)))
  45. goto generic_error;
  46.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1), 
  47.                                   D3DVAL(0.1), D3DVAL(0.1), &la)))
  48.   goto generic_error;
  49.     if (FAILED(scene->lpVtbl->AddLight(scene, la)))
  50. goto generic_error;
  51.     /*
  52.      * load mesh files
  53.      */
  54.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder)))
  55. goto generic_error;
  56.     rval = builder->lpVtbl->Load(builder, "torus.x", NULL,
  57.      D3DRMLOAD_FROMFILE, NULL, NULL);
  58.     if (rval != D3DRM_OK) {
  59.         Msg("Failed to load torus.xn%s", D3DRMErrorToString(rval));
  60. goto ret_with_error;
  61.     }
  62.     if (FAILED(builder->lpVtbl->CreateMesh(builder, &torus_mesh)))
  63. goto generic_error;
  64.     RELEASE(builder);
  65.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder)))
  66. goto generic_error;
  67.     rval = builder->lpVtbl->Load(builder, "sphere2.x", NULL,
  68.      D3DRMLOAD_FROMFILE, NULL, NULL);
  69.     if (rval != D3DRM_OK) {
  70.         Msg("Failed to load sphere2.xn%s", D3DRMErrorToString(rval));
  71. goto ret_with_error;
  72.     }
  73.     if (FAILED(builder->lpVtbl->CreateMesh(builder, &sphere_mesh)))
  74. goto generic_error;
  75.     RELEASE(builder);
  76.     if (FAILED(torus_mesh->lpVtbl->SetGroupColorRGB(torus_mesh, -1, D3DVAL(0.0), 
  77.                                             D3DVAL(0.0), D3DVAL(1.0))))
  78.     goto generic_error;
  79.     /*
  80.      * create a torus frame within the scene create axis frame within
  81.      * frame of sphere create torus frame within frame of axis
  82.      */
  83.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &sphere)))
  84. goto generic_error;
  85.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, sphere, &axis)))
  86. goto generic_error;
  87.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, axis, &torus)))
  88. goto generic_error;
  89.     {
  90. /*
  91.  * load a texture and wrap it onto the sphere
  92.  */
  93. LPDIRECT3DRMTEXTURE tex;
  94. LPDIRECT3DRMWRAP wrap;
  95. D3DVALUE height;
  96. D3DRMBOX box;
  97. D3DVALUE miny, maxy;
  98. if (FAILED(sphere_mesh->lpVtbl->GetBox(sphere_mesh, &box)))
  99.     goto generic_error;
  100. maxy = box.max.y;
  101. miny = box.min.y;
  102. height = maxy - miny;
  103. if (FAILED(lpD3DRM->lpVtbl->CreateWrap(lpD3DRM, D3DRMWRAP_CYLINDER, NULL, D3DVAL(0.0),
  104.                           D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0),
  105.                           D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  106.                           D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
  107.                           D3DDivide(maxy, height), D3DVAL(1.0),
  108.                           D3DDivide(D3DVAL(1), height), &wrap)))
  109.   goto generic_error;
  110. if (FAILED(wrap->lpVtbl->Apply(wrap, (LPDIRECT3DRMOBJECT)sphere_mesh)))
  111.     goto generic_error;
  112. RELEASE(wrap);
  113. rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "tex2.ppm", &tex);
  114. if (rval != D3DRM_OK) {
  115.             Msg("Failed to load tex2.ppmn%s", D3DRMErrorToString(rval));
  116.     goto ret_with_error;
  117. }
  118. if (FAILED(tex->lpVtbl->SetColors(tex, 16)))
  119.     goto generic_error;
  120. if (FAILED(tex->lpVtbl->SetShades(tex, 8)))
  121.     goto generic_error;
  122. if (FAILED(sphere_mesh->lpVtbl->SetGroupTexture(sphere_mesh, -1, tex)))
  123.     goto generic_error;
  124. RELEASE(tex);
  125.     }
  126.     /*
  127.      * add the loaded mesh into the frame
  128.      */
  129.     if (FAILED(torus->lpVtbl->AddVisual(torus, (LPDIRECT3DRMVISUAL) torus_mesh)))
  130. goto generic_error;
  131.     if (FAILED(sphere->lpVtbl->AddVisual(sphere, (LPDIRECT3DRMVISUAL) sphere_mesh)))
  132. goto generic_error;
  133.     /*
  134.      * set up the frames position, orientation and rotation
  135.      */
  136.     if (FAILED(camera->lpVtbl->SetPosition(camera, scene, D3DVAL(0), D3DVAL(0), -D3DVAL(10))))
  137. goto generic_error;
  138.     if (FAILED(sphere->lpVtbl->SetPosition(sphere, scene, D3DVAL(0), D3DVAL(0), D3DVAL(0))))
  139. goto generic_error;
  140.     if (FAILED(axis->lpVtbl->SetPosition(axis, sphere, D3DVAL(2), D3DVAL(0), D3DVAL(0))))
  141. goto generic_error;
  142.     if (FAILED(torus->lpVtbl->SetPosition(torus, axis, D3DVAL(1.0), D3DVAL(0), D3DVAL(0))))
  143. goto generic_error;
  144.     if (FAILED(sphere->lpVtbl->SetRotation(sphere, scene, D3DVAL(0), D3DVAL(1.0), D3DVAL(0.5),D3DVAL(0.05))))
  145. goto generic_error;
  146.     if (FAILED(axis->lpVtbl->SetRotation(axis, sphere, D3DVAL(1), D3DVAL(0), D3DVAL(0), D3DVAL(0.01))))
  147. goto generic_error;
  148.     if (FAILED(torus->lpVtbl->SetRotation(torus, axis, D3DVAL(0), D3DVAL(0), D3DVAL(1), -D3DVAL(0.05))))
  149. goto generic_error;
  150.     RELEASE(lights);
  151.     RELEASE(axis);
  152.     RELEASE(torus_mesh);
  153.     RELEASE(sphere_mesh);
  154.     RELEASE(torus);
  155.     RELEASE(sphere);
  156.     RELEASE(lp);
  157.     RELEASE(la);
  158.     return TRUE;
  159. generic_error:
  160.     Msg("A failure occurred while building the scene.n");
  161. ret_with_error:
  162.     RELEASE(lights);
  163.     RELEASE(axis);
  164.     RELEASE(torus_mesh);
  165.     RELEASE(sphere_mesh);
  166.     RELEASE(torus);
  167.     RELEASE(sphere);
  168.     RELEASE(lp);
  169.     RELEASE(la);
  170.     RELEASE(builder);
  171.     return FALSE;
  172. }
  173. void
  174. OverrideDefaults(Defaults* defaults)
  175. {
  176.     defaults->bConstRenderQuality = TRUE;
  177.     lstrcpy(defaults->Name, "Frame Hierarchy D3D RM Example");
  178. }