TEX5.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

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