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

Windows编程

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: faces.c
  6.  *
  7.  ***************************************************************************/
  8. /*
  9.  * Example program to demonstrate MeshAddFaces
  10.  */
  11. #include "rmdemo.h"
  12. D3DVECTOR cube_vertices[] = {-D3DVAL(0.5), -D3DVAL(0.5), -D3DVAL(0.5),
  13.     -D3DVAL(0.5), -D3DVAL(0.5), D3DVAL(0.5),
  14.     -D3DVAL(0.5), D3DVAL(0.5), -D3DVAL(0.5),
  15.     -D3DVAL(0.5), D3DVAL(0.5), D3DVAL(0.5),
  16.     D3DVAL(0.5), -D3DVAL(0.5), -D3DVAL(0.5),
  17.     D3DVAL(0.5), -D3DVAL(0.5), D3DVAL(0.5),
  18.     D3DVAL(0.5), D3DVAL(0.5), -D3DVAL(0.5),
  19.     D3DVAL(0.5), D3DVAL(0.5), D3DVAL(0.5)
  20. };
  21. /*
  22.  * face_data is a vertex count followed by the vertex reference in the
  23.  * vertices list. If normal_count > 0, then pairs of vectors are
  24.  * referenced: first the vertex and secondly the normal reference. the
  25.  * list is terminated by a 0 (vertex count to a face)
  26.  */
  27. BOOL
  28. build_face1(LPDIRECT3DRMMESHBUILDER msh)
  29. {
  30.     /*
  31.      * add a single face to a mesh.
  32.      */
  33.     /*
  34.      * Single face with all normals pointing in the same direction.
  35.      */
  36.     int vertex_count = 4;
  37.     D3DVECTOR vertices[4] = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0),
  38. D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  39. D3DVAL(1.0), D3DVAL(0.0), D3DVAL(1.0),
  40. D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0)
  41.     };
  42.     int normal_count = 4;
  43.     D3DVECTOR normals[4] = {D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  44. D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  45. D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  46. D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  47.     };
  48.     int face_data[] = {4, 0, 0, 1, 1, 2, 2, 3, 3, 0};
  49.     if (FAILED(msh->lpVtbl->AddFaces(msh, vertex_count, vertices, normal_count, 
  50.                           normals, face_data, NULL)))
  51.   return FALSE;
  52.     return TRUE;
  53. }
  54. BOOL
  55. build_face2(LPDIRECT3DRMMESHBUILDER msh)
  56. {
  57.     /*
  58.      * Single face with normals pointing in different directions to
  59.      * approximate a curved surface.
  60.      */
  61.     int vertex_count = 4;
  62.     D3DVECTOR vertices[4] = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0),
  63. D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  64. D3DVAL(1.0), D3DVAL(0.0), D3DVAL(1.0),
  65. D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0)
  66.     };
  67.     int normal_count = 4;
  68.     D3DVECTOR normals[4] = {
  69. D3DVAL(0.5), D3DVAL(0.7), D3DVAL(0.5),
  70. D3DVAL(0.5), D3DVAL(0.7), -D3DVAL(0.5),
  71. -D3DVAL(0.5), D3DVAL(0.7), -D3DVAL(0.5),
  72. -D3DVAL(0.5), D3DVAL(0.7), D3DVAL(0.5)
  73.     };
  74.     int face_data[] = {4, 0, 0, 1, 1, 2, 2, 3, 3, 0};
  75.     if (FAILED(msh->lpVtbl->AddFaces(msh, vertex_count, vertices, normal_count, 
  76.                           normals, face_data, NULL)))
  77.   return FALSE;
  78.     return TRUE;
  79. }
  80. BOOL
  81. build_cube1(LPDIRECT3DRMMESHBUILDER msh)
  82. {
  83.     /*
  84.      * cube 1 has planar faces, one normal is shared by all vertices of a
  85.      * face
  86.      */
  87.     int face1_data[] = {
  88. 4, 1, 0, 5, 1, 7, 2, 3, 3,
  89. 4, 2, 4, 3, 5, 7, 6, 6, 7,
  90. 4, 5, 8, 4, 9, 6, 10, 7, 11,
  91. 4, 0, 12, 2, 13, 6, 14, 4, 15,
  92. 4, 0, 16, 4, 17, 5, 18, 1, 19,
  93. 4, 0, 20, 1, 21, 3, 22, 2, 23,
  94.     0};
  95.     D3DVECTOR cube1_normals[] = {
  96. D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  97. D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  98. D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  99. D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  100. D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  101. D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  102. D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  103. D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  104. D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
  105. D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
  106. D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
  107. D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
  108. D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1.0),
  109. D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1.0),
  110. D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1.0),
  111. D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1.0),
  112. D3DVAL(0.0), -D3DVAL(1.0), D3DVAL(0.0),
  113. D3DVAL(0.0), -D3DVAL(1.0), D3DVAL(0.0),
  114. D3DVAL(0.0), -D3DVAL(1.0), D3DVAL(0.0),
  115. D3DVAL(0.0), -D3DVAL(1.0), D3DVAL(0.0),
  116. -D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0)
  117. - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0)
  118. - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0)
  119. - D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0)
  120.     };
  121.     if (FAILED(msh->lpVtbl->AddFaces(msh, 8, cube_vertices, 6 * 4, cube1_normals,
  122.   face1_data, NULL)))
  123.   return FALSE;
  124.     return TRUE;
  125. }
  126. BOOL
  127. build_cube2(LPDIRECT3DRMMESHBUILDER msh)
  128. {
  129.     /*
  130.      * cube 2 has rounded faces, the normals radiate out at each vertex,
  131.      * one normal to each vertex
  132.      */
  133.     int face2_data[] = {
  134. 4, 1, 1, 5, 5, 7, 7, 3, 3,
  135. 4, 2, 2, 3, 3, 7, 7, 6, 6,
  136. 4, 5, 5, 4, 4, 6, 6, 7, 7,
  137. 4, 0, 0, 2, 2, 6, 6, 4, 4,
  138. 4, 0, 0, 4, 4, 5, 5, 1, 1,
  139. 4, 0, 0, 1, 1, 3, 3, 2, 2,
  140.     0};
  141.     D3DVECTOR cube2_normals[] = {
  142. -D3DVAL(1.0), -D3DVAL(1.0), -D3DVAL(1.0),
  143. -D3DVAL(1.0), -D3DVAL(1.0), D3DVAL(1.0),
  144. -D3DVAL(1.0), D3DVAL(1.0), -D3DVAL(1.0),
  145. -D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0),
  146. D3DVAL(1.0), -D3DVAL(1.0), -D3DVAL(1.0),
  147. D3DVAL(1.0), -D3DVAL(1.0), D3DVAL(1.0),
  148. D3DVAL(1.0), D3DVAL(1.0), -D3DVAL(1.0),
  149. D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0)
  150.     };
  151.     if (FAILED(msh->lpVtbl->AddFaces(msh, 8, cube_vertices, 8, cube2_normals,
  152.   face2_data, NULL)))
  153.   return FALSE;
  154.     return TRUE;
  155. }
  156. BOOL
  157. BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view,
  158.    LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera)
  159. {
  160.     D3DRMRENDERQUALITY quality = D3DRMRENDER_GOURAUD;
  161.     LPDIRECT3DRMMESHBUILDER light_builder, face1_builder, face2_builder;
  162.     LPDIRECT3DRMMESHBUILDER cube1_builder, cube2_builder;
  163.     LPDIRECT3DRMMESH light_mesh, face1_mesh, face2_mesh, cube1_mesh, cube2_mesh;
  164.     LPDIRECT3DRMFRAME frame1, frame2, face_frame1, face_frame2, light_frame;
  165.     LPDIRECT3DRMFRAME lights;
  166.     LPDIRECT3DRMLIGHT light1, light2;
  167.     HRESULT rval;
  168.     view = view; /* not used */
  169.     light_builder = NULL; face1_builder = NULL; face2_builder = NULL;
  170.     cube1_builder = NULL; cube2_builder = NULL;
  171.     light_mesh = NULL; face1_mesh = NULL; face2_mesh = NULL;
  172.     cube1_mesh = NULL; cube2_mesh = NULL;
  173.     frame1 = NULL; frame2 = NULL; face_frame1 = NULL; face_frame2 = NULL;
  174.     light_frame = NULL; lights = NULL; light1 = NULL; light2 = NULL;
  175.     /*
  176.      * This Demo shows the construction of planar facesn"); with vertex
  177.      * normals for realistic modelling ofn"); flat and curved surfaces by
  178.      * polygonal approximation.n");
  179.      */
  180.     if (FAILED(dev->lpVtbl->SetQuality(dev, quality)))
  181. goto generic_error;
  182.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &face_frame1)))
  183. goto generic_error;
  184.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &face_frame2)))
  185. goto generic_error;
  186.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame1)))
  187. goto generic_error;
  188.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame2)))
  189. goto generic_error;
  190.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &light_frame)))
  191. goto generic_error;
  192.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, light_frame, &lights)))
  193. goto generic_error;
  194.     if (FAILED(lights->lpVtbl->SetPosition(lights, light_frame, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(2.2))))
  195. goto generic_error;
  196.     if (FAILED(light_frame->lpVtbl->SetPosition(light_frame, scene, D3DVAL(0.0), D3DVAL(0.4), D3DVAL(0.0))))
  197. goto generic_error;
  198.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_POINT, D3DVAL(0.9),
  199.                                   D3DVAL(0.8), D3DVAL(0.7), &light1)))
  200.   goto generic_error;
  201.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.02),
  202.                                   D3DVAL(0.01), D3DVAL(0.01), &light2)))
  203.   goto generic_error;
  204.     if (FAILED(lights->lpVtbl->AddLight(lights, light1)))
  205. goto generic_error;
  206.     if (FAILED(scene->lpVtbl->AddLight(scene, light2)))
  207. goto generic_error;
  208.     RELEASE(light1);
  209.     RELEASE(light2);
  210.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &face1_builder)))
  211. goto generic_error;
  212.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &face2_builder)))
  213. goto generic_error;
  214.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &cube1_builder)))
  215. goto generic_error;
  216.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &cube2_builder)))
  217. goto generic_error;
  218.     if (!build_face1(face1_builder))
  219. goto generic_error;
  220.     if (!build_face2(face2_builder))
  221. goto generic_error;
  222.     if (!build_cube1(cube1_builder))
  223. goto generic_error;
  224.     if (!build_cube2(cube2_builder))
  225. goto generic_error;
  226.     if (FAILED(face1_builder->lpVtbl->CreateMesh(face1_builder, &face1_mesh)))
  227. goto generic_error;
  228.     if (FAILED(face2_builder->lpVtbl->CreateMesh(face2_builder, &face2_mesh)))
  229. goto generic_error;
  230.     if (FAILED(cube1_builder->lpVtbl->CreateMesh(cube1_builder, &cube1_mesh)))
  231. goto generic_error;
  232.     if (FAILED(cube2_builder->lpVtbl->CreateMesh(cube2_builder, &cube2_mesh)))
  233. goto generic_error;
  234.     RELEASE(face1_builder);
  235.     RELEASE(face2_builder);
  236.     RELEASE(cube1_builder);
  237.     RELEASE(cube2_builder);
  238.     if (FAILED(face_frame1->lpVtbl->AddVisual(face_frame1, (LPDIRECT3DRMVISUAL) face1_mesh)))
  239. goto generic_error;
  240.     if (FAILED(face_frame2->lpVtbl->AddVisual(face_frame2, (LPDIRECT3DRMVISUAL) face2_mesh)))
  241. goto generic_error;
  242.     if (FAILED(frame1->lpVtbl->AddVisual(frame1, (LPDIRECT3DRMVISUAL) cube1_mesh)))
  243. goto generic_error;
  244.     if (FAILED(frame2->lpVtbl->AddVisual(frame2, (LPDIRECT3DRMVISUAL) cube2_mesh)))
  245. goto generic_error;
  246.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &light_builder)))
  247. goto generic_error;
  248.     rval = light_builder->lpVtbl->Load(light_builder, "sphere0.x", NULL,
  249.      D3DRMLOAD_FROMFILE, NULL, NULL);
  250.     if (rval != D3DRM_OK) {
  251.         Msg("Failed to load sphere0.xn");
  252. goto ret_with_error;
  253.     }
  254.     if (FAILED(light_builder->lpVtbl->SetColorRGB(light_builder, D3DVAL(1), D3DVAL(1),
  255.                                         D3DVAL(1))))
  256. goto generic_error;
  257.     if (FAILED(light_builder->lpVtbl->Scale(light_builder, D3DVAL(0.1), D3DVAL(0.1), 
  258.                                  D3DVAL(0.1))))
  259.  goto generic_error;
  260.     if (FAILED(light_builder->lpVtbl->SetQuality(light_builder, D3DRMRENDER_UNLITFLAT)))
  261. goto generic_error;
  262.     if (FAILED(light_builder->lpVtbl->CreateMesh(light_builder, &light_mesh)))
  263. goto generic_error;
  264.     RELEASE(light_builder);
  265.     if (FAILED(lights->lpVtbl->AddVisual(lights, (LPDIRECT3DRMVISUAL) light_mesh)))
  266. goto generic_error;
  267.     if (FAILED(camera->lpVtbl->SetPosition(camera, scene, D3DVAL(0.0), D3DVAL(2), -D3DVAL(5))))
  268. goto generic_error;
  269.     if (FAILED(face_frame1->lpVtbl->SetPosition(face_frame1, scene, -D3DVAL(0.5), 
  270.                                      D3DVAL(0.5), D3DVAL(2))))
  271.      goto generic_error;
  272.     if (FAILED(face_frame2->lpVtbl->SetPosition(face_frame2, scene, -D3DVAL(0.5), 
  273.                                      -D3DVAL(1.5), D3DVAL(2))))
  274.      goto generic_error;
  275.     if (FAILED(frame1->lpVtbl->SetPosition(frame1, scene, -D3DVAL(2.0), D3DVAL(0.0), D3DVAL(2))))
  276. goto generic_error;
  277.     if (FAILED(frame2->lpVtbl->SetPosition(frame2, scene, D3DVAL(1.5), D3DVAL(0.0), D3DVAL(2))))
  278. goto generic_error;
  279.     if (FAILED(face_frame1->lpVtbl->SetOrientation(face_frame1, scene, D3DVAL(0.0), D3DVAL(1), D3DVAL(0.0),
  280.                                         D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1))))
  281. goto generic_error;
  282.     if (FAILED(face_frame2->lpVtbl->SetOrientation(face_frame2, scene, D3DVAL(0.0), D3DVAL(1), D3DVAL(0.0),
  283.                                         D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1))))
  284. goto generic_error;
  285.     if (FAILED(camera->lpVtbl->SetOrientation(camera, scene, D3DVAL(0.0), -D3DVAL(0.2), D3DVAL(1),
  286.                                    D3DVAL(0.0), D3DVAL(1), D3DVAL(0.0))))
  287.    goto generic_error;
  288.     if (FAILED(frame1->lpVtbl->SetRotation(frame1, scene, D3DVAL(1), D3DVAL(0.0), D3DVAL(1),
  289.                                 -D3DVAL(0.005))))
  290. goto generic_error;
  291.     if (FAILED(frame2->lpVtbl->SetRotation(frame2, scene, D3DVAL(0.0), D3DVAL(1), D3DVAL(1),
  292.                                 -D3DVAL(0.005))))
  293. goto generic_error;
  294.     if (FAILED(light_frame->lpVtbl->SetRotation(light_frame, scene, D3DVAL(0.0), D3DVAL(1), D3DVAL(0.0),
  295.                                      -D3DVAL(0.02))))
  296.      goto generic_error;
  297.     RELEASE(light_mesh);
  298.     RELEASE(face1_mesh);
  299.     RELEASE(face2_mesh);
  300.     RELEASE(cube1_mesh);
  301.     RELEASE(cube2_mesh);
  302.     RELEASE(frame1);
  303.     RELEASE(frame2);
  304.     RELEASE(face_frame1);
  305.     RELEASE(face_frame2);
  306.     RELEASE(light_frame);
  307.     RELEASE(lights);
  308.     return TRUE;
  309. generic_error:
  310.     Msg("An error has occurred while building the scene.n");
  311. ret_with_error:
  312.     RELEASE(light_builder);
  313.     RELEASE(face1_builder);
  314.     RELEASE(face2_builder);
  315.     RELEASE(cube1_builder);
  316.     RELEASE(cube2_builder);
  317.     RELEASE(light_mesh);
  318.     RELEASE(face1_mesh);
  319.     RELEASE(face2_mesh);
  320.     RELEASE(cube1_mesh);
  321.     RELEASE(cube2_mesh);
  322.     RELEASE(frame1);
  323.     RELEASE(frame2);
  324.     RELEASE(face_frame1);
  325.     RELEASE(face_frame2);
  326.     RELEASE(light_frame);
  327.     RELEASE(lights);
  328.     RELEASE(light1);
  329.     RELEASE(light2);
  330.     return FALSE;
  331. }
  332. void
  333. OverrideDefaults(Defaults *defaults)
  334. {
  335.     defaults->bNoTextures = TRUE;
  336.     defaults->bConstRenderQuality = TRUE;
  337.     lstrcpy(defaults->Name, "Faces Direct3DRM Example");
  338. }