home *** CD-ROM | disk | FTP | other *** search
/ NEXT Generation 27 / NEXT27.iso / pc / demos / emperor / dx3.exe / SDK / SAMPLES / FACES / FACES.C next >
C/C++ Source or Header  |  1996-08-28  |  15KB  |  375 lines

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