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

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: shadow.c
  6.  *
  7.  ***************************************************************************/
  8.  
  9. #include "rmdemo.h"
  10.  
  11. BOOL
  12. BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view,
  13.            LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera)
  14. {
  15.     D3DRMRENDERQUALITY quality = D3DRMRENDER_FLAT;
  16.     LPDIRECT3DRMFRAME lights = NULL;
  17.     LPDIRECT3DRMMESHBUILDER teapot_builder = NULL;
  18.     LPDIRECT3DRMMESH teapot_mesh = NULL;
  19.     LPDIRECT3DRMVISUAL teapot_shadow = NULL;
  20.     LPDIRECT3DRMFRAME teapot = NULL;
  21.     LPDIRECT3DRMLIGHT shadow_light = NULL;
  22.     LPDIRECT3DRMLIGHT l2 = NULL;
  23.     HRESULT rval;
  24.  
  25.     view = view;                /* not used */
  26.  
  27.     if (FAILED(dev->lpVtbl->SetQuality(dev, quality)))
  28.         goto generic_error;
  29.     if (FAILED(scene->lpVtbl->SetSceneBackgroundRGB(scene, D3DVAL(1), D3DVAL(1),
  30.                                          D3DVAL(1))))
  31.                                          goto generic_error;
  32.  
  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(2), D3DVAL(5),
  39.                                 -D3DVAL(10))))
  40.                                 goto generic_error;
  41.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_POINT, D3DVAL(0.9),
  42.                                   D3DVAL(0.8), D3DVAL(0.7), &shadow_light)))
  43.                                   goto generic_error;
  44.     if (FAILED(lights->lpVtbl->AddLight(lights, shadow_light)))
  45.         goto generic_error;
  46.  
  47.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1),
  48.                                   D3DVAL(0.1), D3DVAL(0.1), &l2)))
  49.                                   goto generic_error;
  50.     if (FAILED(scene->lpVtbl->AddLight(scene, l2)))
  51.         goto generic_error;
  52.  
  53.     /*
  54.      * load mesh file
  55.      */
  56.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &teapot_builder)))
  57.         goto generic_error;
  58.     rval = teapot_builder->lpVtbl->Load(teapot_builder, "teapot.x", NULL,
  59.                                 D3DRMLOAD_FROMFILE, NULL, NULL);
  60.     if (rval != D3DRM_OK) {
  61.         Msg("Failed to load teapot.x.\n");
  62.         goto ret_with_error;
  63.     }
  64.     if (FAILED(teapot_builder->lpVtbl->CreateMesh(teapot_builder, &teapot_mesh)))
  65.         goto generic_error;
  66.     RELEASE(teapot_builder);
  67.  
  68.     /*
  69.      * create a teapot frame within the scene
  70.      */
  71.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &teapot)))
  72.         goto generic_error;
  73.     if (FAILED(lpD3DRM->lpVtbl->CreateShadow(lpD3DRM, (LPDIRECT3DRMVISUAL) teapot_mesh,
  74.                                 shadow_light, D3DVAL(0), D3DVAL(-3), D3DVAL(0), D3DVAL(0), D3DVAL(1),
  75.                                 D3DVAL(0), &teapot_shadow)))
  76.                                 goto generic_error;
  77.  
  78.     /*
  79.      * add the loaded mesh into the frame
  80.      */
  81.     if (FAILED(teapot->lpVtbl->AddVisual(teapot, (LPDIRECT3DRMVISUAL) teapot_mesh)))
  82.         goto generic_error;
  83.     if (FAILED(teapot->lpVtbl->AddVisual(teapot, teapot_shadow)))
  84.         goto generic_error;
  85.  
  86.     /*
  87.      * set up the frames position, orientation and rotation
  88.      */
  89.  
  90.     if (FAILED(camera->lpVtbl->SetPosition(camera, scene, D3DVAL(0), D3DVAL(0), -D3DVAL(10))))
  91.         goto generic_error;
  92.     if (FAILED(camera->lpVtbl->SetOrientation(camera, scene, D3DVAL(0), D3DVAL(0), D3DVAL(1), D3DVAL(0),
  93.                                    D3DVAL(1), D3DVAL(0))))
  94.                                    goto generic_error;
  95.     if (FAILED(teapot->lpVtbl->SetRotation(teapot, scene, D3DVAL(0), D3DVAL(1), D3DVAL(1),
  96.                                 D3DVAL(0.02))))
  97.                                 goto generic_error;
  98.  
  99.     RELEASE(lights);
  100.     RELEASE(teapot_mesh);
  101.     RELEASE(teapot_shadow);
  102.     RELEASE(teapot);
  103.     RELEASE(shadow_light);
  104.     RELEASE(l2);
  105.     return TRUE;
  106. generic_error:
  107.     Msg("A failure occurred while building the scene.\n");
  108. ret_with_error:
  109.     RELEASE(lights);
  110.     RELEASE(teapot_builder);
  111.     RELEASE(teapot_mesh);
  112.     RELEASE(teapot_shadow);
  113.     RELEASE(teapot);
  114.     RELEASE(shadow_light);
  115.     RELEASE(l2);
  116.     return FALSE;
  117. }
  118.  
  119. void
  120. OverrideDefaults(Defaults* defaults)
  121. {
  122.     defaults->bNoTextures = TRUE;
  123.     defaults->bConstRenderQuality = TRUE;
  124.     lstrcpy(defaults->Name, "Shadow Direct3DRM Example");
  125. }
  126.