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

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