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 / hier2 / hier2.c next >
C/C++ Source or Header  |  1997-07-14  |  8KB  |  225 lines

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: hier2.c
  6.  *
  7.  ***************************************************************************/
  8.  
  9. /*
  10.  * D3D RM Tutorial program frame hierarchy 2
  11.  */
  12.  
  13. #include "rmdemo.h"
  14.  
  15. BOOL
  16. BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view,
  17.        LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera)
  18. {
  19.     D3DRMRENDERQUALITY quality = D3DRMRENDER_FLAT;
  20.     LPDIRECT3DRMLIGHT l1 = NULL;
  21.     LPDIRECT3DRMLIGHT l2 = NULL;
  22.     LPDIRECT3DRMFRAME lights = NULL;
  23.     LPDIRECT3DRMMESHBUILDER torus_builder = NULL;
  24.     LPDIRECT3DRMMESHBUILDER sphere_builder = NULL;
  25.     LPDIRECT3DRMMESHBUILDER cube1_builder = NULL;
  26.     LPDIRECT3DRMMESHBUILDER cube2_builder = NULL;
  27.     LPDIRECT3DRMMESH cube1_mesh = NULL;
  28.     LPDIRECT3DRMMESH cube2_mesh = NULL;
  29.     LPDIRECT3DRMMESH torus_mesh = NULL;
  30.     LPDIRECT3DRMMESH sphere_mesh = NULL;
  31.     LPDIRECT3DRMFRAME torus = NULL;
  32.     LPDIRECT3DRMFRAME sphere = NULL;
  33.     LPDIRECT3DRMFRAME cube1 = NULL;
  34.     LPDIRECT3DRMFRAME cube2 = NULL;
  35.     HRESULT rval;
  36.     view = view;        /* not used */
  37.  
  38.     /*
  39.      * This Demo shows a more complex hierarchy of frames
  40.      */
  41.  
  42.     if (FAILED(dev->lpVtbl->SetQuality(dev, quality)))
  43.     goto generic_error;
  44.     if (FAILED(dev->lpVtbl->SetShades(dev, 16)))
  45.     goto generic_error;
  46.  
  47.     /*
  48.      * initialize the lights in the scene
  49.      */
  50.  
  51.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &lights)))
  52.     goto generic_error;
  53.     if (FAILED(lights->lpVtbl->SetPosition(lights, scene, D3DVAL(5), D3DVAL(5),
  54.                                 -D3DVAL(5))))
  55.                 goto generic_error;
  56.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_POINT, D3DVAL(0.9),
  57.                                   D3DVAL(0.8), D3DVAL(0.7), &l1)))
  58.                   goto generic_error;
  59.     if (FAILED(lights->lpVtbl->AddLight(lights, l1)))
  60.     goto generic_error;
  61.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1),
  62.                                   D3DVAL(0.1), D3DVAL(0.1), &l2)))
  63.                   goto generic_error;
  64.     if (FAILED(scene->lpVtbl->AddLight(scene, l2)))
  65.     goto generic_error;
  66.     /*
  67.      * load mesh files
  68.      */
  69.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &torus_builder)))
  70.     goto generic_error;
  71.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &sphere_builder)))
  72.     goto generic_error;
  73.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &cube1_builder)))
  74.     goto generic_error;
  75.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &cube2_builder)))
  76.     goto generic_error;
  77.     rval = torus_builder->lpVtbl->Load(torus_builder, "torus.x", NULL,
  78.                     D3DRMLOAD_FROMFILE, NULL, NULL);
  79.     if (rval != D3DRM_OK) {
  80.         Msg("Failed to load torus.x.\n");
  81.     goto ret_with_error;
  82.     }
  83.     rval = sphere_builder->lpVtbl->Load(sphere_builder, "sphere4.x", NULL,
  84.                     D3DRMLOAD_FROMFILE, NULL, NULL);
  85.     if (rval != D3DRM_OK) {
  86.         Msg("Failed to load sphere4.x.\n");
  87.     goto ret_with_error;
  88.     }
  89.     rval = cube1_builder->lpVtbl->Load(cube1_builder, "cube.x", NULL,
  90.                     D3DRMLOAD_FROMFILE, NULL, NULL);
  91.     if (rval != D3DRM_OK) {
  92.         Msg("Failed to load cube.x.\n");
  93.     goto ret_with_error;
  94.     }
  95.     rval = cube2_builder->lpVtbl->Load(cube2_builder, "cube.x", NULL,
  96.                     D3DRMLOAD_FROMFILE, NULL, NULL);
  97.     if (rval != D3DRM_OK) {
  98.         Msg("Failed to load cube.x.\n");
  99.     goto ret_with_error;
  100.     }
  101.  
  102.     if (FAILED(cube1_builder->lpVtbl->Scale(cube1_builder, D3DVAL(0.25), D3DVAL(0.5),
  103.                                  D3DVAL(1.0))))
  104.                  goto generic_error;
  105.     if (FAILED(cube2_builder->lpVtbl->Scale(cube2_builder, D3DVAL(0.5), D3DVAL(1.5),
  106.                                  D3DVAL(1.0))))
  107.                  goto generic_error;
  108.  
  109.     if (FAILED(cube1_builder->lpVtbl->SetColorRGB(cube1_builder, D3DVAL(0.7), 
  110.                                         D3DVAL(0.0), D3DVAL(0.8))))
  111.                     goto generic_error;
  112.     if (FAILED(cube2_builder->lpVtbl->SetColorRGB(cube2_builder, D3DVAL(0.0),
  113.                                         D3DVAL(1.0), D3DVAL(0.5))))
  114.                     goto generic_error;
  115.     if (FAILED(torus_builder->lpVtbl->SetColorRGB(torus_builder, D3DVAL(0.2),
  116.                                         D3DVAL(1.0), D3DVAL(0.8))))
  117.                     goto generic_error;
  118.  
  119.     if (FAILED(torus_builder->lpVtbl->CreateMesh(torus_builder, &torus_mesh)))
  120.     goto generic_error;
  121.     if (FAILED(sphere_builder->lpVtbl->CreateMesh(sphere_builder, &sphere_mesh)))
  122.     goto generic_error;
  123.     if (FAILED(cube1_builder->lpVtbl->CreateMesh(cube1_builder, &cube1_mesh)))
  124.     goto generic_error;
  125.     if (FAILED(cube2_builder->lpVtbl->CreateMesh(cube2_builder, &cube2_mesh)))
  126.     goto generic_error;
  127.     RELEASE(torus_builder);
  128.     RELEASE(sphere_builder);
  129.     RELEASE(cube1_builder);
  130.     RELEASE(cube2_builder);
  131.  
  132.     /*
  133.      * create a torus frame within the scene create torus frame within
  134.      * frame of sphere cube frame within frame of torus
  135.      */
  136.  
  137.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &sphere)))
  138.     goto generic_error;
  139.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, sphere, &torus)))
  140.     goto generic_error;
  141.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, torus, &cube1)))
  142.     goto generic_error;
  143.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, torus, &cube2)))
  144.     goto generic_error;
  145.  
  146.     /*
  147.      * add the loaded mesh into the frame
  148.      */
  149.  
  150.     if (FAILED(torus->lpVtbl->AddVisual(torus, (LPDIRECT3DRMVISUAL) torus_mesh)))
  151.     goto generic_error;
  152.     if (FAILED(sphere->lpVtbl->AddVisual(sphere, (LPDIRECT3DRMVISUAL) sphere_mesh)))
  153.     goto generic_error;
  154.     if (FAILED(cube1->lpVtbl->AddVisual(cube1, (LPDIRECT3DRMVISUAL) cube1_mesh)))
  155.     goto generic_error;
  156.     if (FAILED(cube2->lpVtbl->AddVisual(cube2, (LPDIRECT3DRMVISUAL) cube2_mesh)))
  157.     goto generic_error;
  158.  
  159.     /*
  160.      * set up the frames position, orientation and rotations
  161.      */
  162.  
  163.     if (FAILED(camera->lpVtbl->SetPosition(camera, scene, D3DVAL(0), D3DVAL(0), -D3DVAL(25))))
  164.     goto generic_error;
  165.     if (FAILED(sphere->lpVtbl->SetPosition(sphere, scene, D3DVAL(0), D3DVAL(0), D3DVAL(0))))
  166.     goto generic_error;
  167.     if (FAILED(torus->lpVtbl->SetPosition(torus, sphere, D3DVAL(6), D3DVAL(0), D3DVAL(0))))
  168.     goto generic_error;
  169.     if (FAILED(cube1->lpVtbl->SetPosition(cube1, torus, D3DVAL(0), D3DVAL(4), D3DVAL(0))))
  170.     goto generic_error;
  171.     if (FAILED(cube2->lpVtbl->SetPosition(cube2, torus, D3DVAL(0), -D3DVAL(4), D3DVAL(0))))
  172.     goto generic_error;
  173.  
  174.     if (FAILED(sphere->lpVtbl->SetRotation(sphere, scene, D3DVAL(0), D3DVAL(0), D3DVAL(1),D3DVAL(0.01))))
  175.     goto generic_error;
  176.     if (FAILED(torus->lpVtbl->SetRotation(torus, sphere, D3DVAL(1), D3DVAL(0), D3DVAL(0), D3DVAL(0.02))))
  177.     goto generic_error;
  178.     if (FAILED(cube1->lpVtbl->SetRotation(cube1, torus, D3DVAL(0.1), D3DVAL(0.2),
  179.                                D3DVAL(0.7), D3DVAL(0.03))))
  180.                    goto generic_error;
  181.     if (FAILED(cube2->lpVtbl->SetRotation(cube2, torus, D3DVAL(0.7), D3DVAL(0.1),
  182.                                D3DVAL(0.2), D3DVAL(0.03))))
  183.                    goto generic_error;
  184.  
  185.     RELEASE(lights);
  186.     RELEASE(torus_mesh);
  187.     RELEASE(sphere_mesh);
  188.     RELEASE(cube1_mesh);
  189.     RELEASE(cube2_mesh);
  190.     RELEASE(torus);
  191.     RELEASE(sphere);
  192.     RELEASE(cube1);
  193.     RELEASE(cube2);
  194.     RELEASE(l1);
  195.     RELEASE(l2);
  196.     return TRUE;
  197. generic_error:
  198.     Msg("A failure occurred while building the scene.\n");
  199. ret_with_error:
  200.     RELEASE(l1);
  201.     RELEASE(l2);
  202.     RELEASE(lights);
  203.     RELEASE(torus_builder);
  204.     RELEASE(sphere_builder);
  205.     RELEASE(cube1_builder);
  206.     RELEASE(cube2_builder);
  207.     RELEASE(cube1_mesh);
  208.     RELEASE(cube2_mesh);
  209.     RELEASE(torus_mesh);
  210.     RELEASE(sphere_mesh);
  211.     RELEASE(torus);
  212.     RELEASE(sphere);
  213.     RELEASE(cube1);
  214.     RELEASE(cube2);
  215.     return FALSE;
  216. }
  217.  
  218. void
  219. OverrideDefaults(Defaults* defaults)
  220. {
  221.     defaults->bNoTextures = TRUE;
  222.     defaults->bConstRenderQuality = TRUE;
  223.     lstrcpy(defaults->Name, "Frame Hierarchy II D3D RM Example");
  224. }
  225.