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 / tex4 / tex4.c < prev    next >
C/C++ Source or Header  |  1997-07-14  |  7KB  |  199 lines

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: tex4.c
  6.  *
  7.  ***************************************************************************/
  8.  
  9. /*
  10.  * A texture mapping example using a spherical mapping relative to the
  11.  * camera. The texture is also used as a background for the scene.
  12.  */
  13.  
  14. #include "rmdemo.h"
  15.  
  16. void CDECL 
  17. applyWrap(LPDIRECT3DRMFRAME frame, void* arg, D3DVALUE delta)
  18. {
  19.     LPDIRECT3DRMWRAP wrap = (LPDIRECT3DRMWRAP) arg;
  20.     LPDIRECT3DRMVISUALARRAY visuals;
  21.     LPDIRECT3DRMVISUAL v;
  22.     int count, i;
  23.     LPDIRECT3DRMMESH mesh;
  24.  
  25.     frame->lpVtbl->GetVisuals(frame, &visuals);
  26.     count = visuals->lpVtbl->GetSize(visuals);
  27.  
  28.     for (i = 0; i < count; i++) {
  29.     visuals->lpVtbl->GetElement(visuals, i, &v);
  30.  
  31.     if (SUCCEEDED(v->lpVtbl->QueryInterface(v, &IID_IDirect3DRMMesh, &mesh))) {
  32.         wrap->lpVtbl->ApplyRelative(wrap, frame, (LPDIRECT3DRMOBJECT)mesh);
  33.         mesh->lpVtbl->Release(mesh);
  34.     }
  35.     v->lpVtbl->Release(v);
  36.     }
  37.  
  38.     visuals->lpVtbl->Release(visuals);
  39. }
  40.  
  41. void CDECL 
  42. cleanupWrap(LPDIRECT3DRMOBJECT obj, void *arg)
  43. {
  44.     LPDIRECT3DRMWRAP wrap = (LPDIRECT3DRMWRAP) arg;
  45.     obj;
  46.  
  47.     wrap->lpVtbl->Release(wrap);
  48. }
  49.  
  50. BOOL
  51. BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view,
  52.        LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera)
  53. {
  54.     LPDIRECT3DRMMESH mesh = NULL;
  55.     LPDIRECT3DRMFRAME frame = NULL;
  56.     LPDIRECT3DRMFRAME axis = NULL;
  57.     LPDIRECT3DRMFRAME child = NULL;
  58.     LPDIRECT3DRMTEXTURE tex = NULL;
  59.     LPDIRECT3DRMWRAP wrap = NULL;
  60.     LPDIRECT3DRMLIGHT light1 = NULL;
  61.     LPDIRECT3DRMLIGHT light2 = NULL;
  62.     LPDIRECT3DRMMESHBUILDER builder = NULL;
  63.     HRESULT rval;
  64.     dev;
  65.     view;
  66.     camera;
  67.  
  68.  
  69.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.2),
  70.                                   D3DVAL(0.2), D3DVAL(0.2), &light1)))
  71.                   goto generic_error;
  72.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_DIRECTIONAL, D3DVAL(1),
  73.                                   D3DVAL(1), D3DVAL(1), &light2)))
  74.                   goto generic_error;
  75.     if (FAILED(scene->lpVtbl->AddLight(scene, light1)))
  76.     goto generic_error;
  77.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame)))
  78.     goto generic_error;
  79.     if (FAILED(frame->lpVtbl->SetOrientation(frame, scene, -D3DVAL(1), -D3DVAL(1),
  80.                                   D3DVAL(1), D3DVAL(0), D3DVAL(1), D3DVAL(0))))
  81.                   goto generic_error;
  82.     if (FAILED(frame->lpVtbl->AddLight(frame, light2)))
  83.     goto generic_error;
  84.     RELEASE(frame);
  85.  
  86.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &frame)))
  87.     goto generic_error;
  88.     if (FAILED(frame->lpVtbl->SetPosition(frame, scene, D3DVAL(0), D3DVAL(0), D3DVAL(15))))
  89.     goto generic_error;
  90.     if (FAILED(frame->lpVtbl->SetRotation(frame, scene, D3DVAL(1.1), D3DVAL(0.3),
  91.                                D3DVAL(0.0), D3DVAL(0.04))))
  92.                    goto generic_error;
  93.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder)))
  94.     goto generic_error;
  95.     rval = builder->lpVtbl->Load(builder, "sphere3.x", NULL, D3DRMLOAD_FROMFILE, NULL, NULL);
  96.     if (rval != D3DRM_OK) {
  97.         Msg("Failed to load sphere3.x.\n");
  98.     goto ret_with_error;
  99.     }
  100.     if (FAILED(builder->lpVtbl->Scale(builder, D3DVAL(0.2), D3DVAL(0.2), D3DVAL(0.2))))
  101.     goto generic_error;
  102.     if (FAILED(builder->lpVtbl->CreateMesh(builder, &mesh)))
  103.     goto generic_error;
  104.     RELEASE(builder);
  105.     if (FAILED(frame->lpVtbl->AddVisual(frame, (LPDIRECT3DRMVISUAL) mesh)))
  106.     goto generic_error;
  107.     RELEASE(mesh);
  108.  
  109.     if (FAILED(lpD3DRM->lpVtbl->CreateWrap(lpD3DRM, D3DRMWRAP_SPHERE, camera,
  110.                   D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0),
  111.                   D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  112.                   D3DVAL(0.0), D3DVAL(0.0), -D3DVAL(1.0),
  113.                   D3DVAL(0.0), D3DVAL(0.0),
  114.                   D3DVAL(5.0), D3DVAL(5.0),
  115.                   &wrap)))
  116.                   goto generic_error;
  117.  
  118.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, frame, &axis)))
  119.     goto generic_error;
  120.     if (FAILED(axis->lpVtbl->SetRotation(axis, frame, D3DVAL(0), D3DVAL(1), D3DVAL(0), D3DVAL(0.04))))
  121.     goto generic_error;
  122.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, axis, &child)))
  123.     goto generic_error;
  124.     if (FAILED(child->lpVtbl->SetPosition(child, axis, D3DVAL(3), D3DVAL(0), D3DVAL(0))))
  125.     goto generic_error;
  126.     if (FAILED(child->lpVtbl->SetRotation(child, axis, D3DVAL(1), D3DVAL(1), D3DVAL(0),
  127.                                D3DVAL(0.04))))
  128.                    goto generic_error;
  129.  
  130.     rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "lake.ppm", &tex);
  131.     if (rval != D3DRM_OK) {
  132.     Msg("Failed to load lake.ppm.\n");
  133.     goto ret_with_error;
  134.     }
  135.     if (FAILED(tex->lpVtbl->SetColors(tex, 32)))
  136.     goto generic_error;
  137.     if (FAILED(tex->lpVtbl->SetDecalScale(tex, TRUE)))
  138.     goto generic_error;
  139.     if (FAILED(tex->lpVtbl->SetDecalOrigin(tex, 128, 128)))
  140.     goto generic_error;
  141.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder)))
  142.     goto generic_error;
  143.     rval = builder->lpVtbl->Load(builder, "tpot2.x", NULL, D3DRMLOAD_FROMFILE, NULL, NULL);
  144.     if (rval != D3DRM_OK) {
  145.         Msg("Failed to load tpot2.x.\n");
  146.     goto ret_with_error;
  147.     }
  148.  
  149.     if (FAILED(builder->lpVtbl->Scale(builder, D3DVAL(2), D3DVAL(2), D3DVAL(2))))
  150.     goto generic_error;
  151.     if (FAILED(builder->lpVtbl->SetTexture(builder, tex)))
  152.     goto generic_error;
  153.     if (FAILED(builder->lpVtbl->SetQuality(builder, D3DRMRENDER_GOURAUD)))
  154.     goto generic_error;
  155.     if (FAILED(builder->lpVtbl->CreateMesh(builder, &mesh)))
  156.     goto generic_error;
  157.     RELEASE(builder);
  158.  
  159.     if (FAILED(child->lpVtbl->AddVisual(child, (LPDIRECT3DRMVISUAL) mesh)))
  160.     goto generic_error;
  161.     if (FAILED(child->lpVtbl->AddMoveCallback(child, applyWrap, (void *) wrap)))
  162.     goto generic_error;
  163.     if (FAILED(child->lpVtbl->AddDestroyCallback(child, cleanupWrap, wrap)))
  164.     goto generic_error;
  165.     if (FAILED(scene->lpVtbl->SetSceneBackgroundImage(scene, tex)))
  166.     goto generic_error;
  167.  
  168.     RELEASE(mesh);
  169.     RELEASE(frame);
  170.     RELEASE(axis);
  171.     RELEASE(child);
  172.     RELEASE(tex);
  173.     RELEASE(light1);
  174.     RELEASE(light2);
  175.  
  176.     /* don't release the wrap */
  177.     return TRUE;
  178. generic_error:
  179.     Msg("A failure occurred while building the scene.\n");
  180. ret_with_error:
  181.     RELEASE(mesh);
  182.     RELEASE(frame);
  183.     RELEASE(axis);
  184.     RELEASE(child);
  185.     RELEASE(tex);
  186.     RELEASE(wrap);
  187.     RELEASE(light1);
  188.     RELEASE(light2);
  189.     RELEASE(builder);
  190.     return FALSE;
  191. }
  192.  
  193. void
  194. OverrideDefaults(Defaults* defaults)
  195. {
  196.     defaults->bConstRenderQuality = TRUE;
  197.     lstrcpy(defaults->Name, "Texture Mapping IV Direct3DRM Example");
  198. }
  199.