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

Windows编程

开发平台:

Visual C++

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: trans.c
  6.  *
  7.  ***************************************************************************/
  8. #include "rmdemo.h"
  9. unsigned char check[] = {
  10.     1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2,
  11.     1, 1, 1, 1, 2, 2, 2, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2,
  12.     1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2,
  13.     1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2,
  14.     1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2,
  15.     1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1,
  16.     2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 3, 3, 2, 1, 0, 0, 1,
  17.     2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1,
  18.     2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1,
  19.     2, 3, 3, 2, 1, 0, 0, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1,
  20.     2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
  21.     1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2,
  22.     1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2,
  23.     1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2,
  24.     1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 1, 1, 1, 2, 2, 2, 2,
  25.     1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2,
  26.     2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1,
  27.     2, 2, 2, 2, 1, 1, 1, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1,
  28.     2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1,
  29.     2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1,
  30.     2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1,
  31.     2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2,
  32.     1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 0, 0, 1, 2, 3, 3, 2,
  33.     1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2,
  34.     1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2,
  35.     1, 0, 0, 1, 2, 3, 3, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2,
  36.     1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1,
  37.     2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1,
  38.     2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1,
  39.     2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1,
  40.     2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 2, 2, 2, 1, 1, 1, 1,
  41.     2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1,
  42.     1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2,
  43.     1, 1, 1, 1, 2, 2, 2, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2,
  44.     1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2,
  45.     1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2,
  46.     1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2,
  47.     1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1,
  48.     2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 3, 3, 2, 1, 0, 0, 1,
  49.     2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1,
  50.     2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 0, 0, 1,
  51.     2, 3, 3, 2, 1, 0, 0, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1,
  52.     2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1,
  53. };
  54. D3DRMPALETTEENTRY checkPal[] = {
  55.     {0, 0, 0, D3DRMPALETTE_READONLY},
  56.     {127, 255, 127, D3DRMPALETTE_READONLY},
  57.     {0, 0, 255, D3DRMPALETTE_READONLY},
  58.     {255, 255, 127, D3DRMPALETTE_READONLY},
  59.     {255, 255, 255, D3DRMPALETTE_READONLY},
  60. };
  61. D3DRMIMAGE checkImage = {
  62.     32, 32,
  63.     1, 1,
  64.     8, FALSE,
  65.     32,
  66.     check, NULL,
  67.     0xff, 0xff, 0xff, 0xff,
  68.     5, checkPal,
  69. };
  70. static void CDECL mutateTexture(LPDIRECT3DRMFRAME frame, void* arg, D3DVALUE delta)
  71. {
  72.     LPDIRECT3DRMTEXTURE tex = (LPDIRECT3DRMTEXTURE) arg;
  73.     static int col = -1;
  74.     static int delay = 10;
  75.     static int count = 0;
  76.     int i;
  77.     if (--delay)
  78. return;
  79.     delay = 10;
  80.     if (col >= 0)
  81. for (i = 0; i < sizeof(check); i++)
  82.     if (check[i] == 4)
  83. check[i] = col;
  84.     count++;
  85.     col = count & 3;
  86.     for (i = 0; i < sizeof(check); i++)
  87. if (check[i] == col)
  88.     check[i] = 4;
  89.     tex->lpVtbl->Changed(tex, TRUE, FALSE);
  90. }
  91. BOOL
  92. BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view,
  93.    LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera)
  94. {
  95.     LPDIRECT3DRMFRAME box1 = NULL;
  96.     LPDIRECT3DRMFRAME box2 = NULL;
  97.     LPDIRECT3DRMFRAME sphere = NULL;
  98.     LPDIRECT3DRMFRAME decal = NULL;
  99.     LPDIRECT3DRMFRAME light = NULL;
  100.     LPDIRECT3DRMMESH obj = NULL;
  101.     LPDIRECT3DRMLIGHT dlight = NULL;
  102.     LPDIRECT3DRMLIGHT alight = NULL;
  103.     LPDIRECT3DRMTEXTURE tex = NULL;
  104.     LPDIRECT3DRMMESHBUILDER builder = NULL;
  105.     LPDIRECT3DRMWRAP wrap = NULL;
  106.     LPDIRECT3DRMTEXTURE sphereTex = NULL;
  107.     LPDIRECT3DRMTEXTURE decalTex = NULL;
  108.     LPDIRECT3DRMMATERIAL mat = NULL;
  109.     D3DRMBOX box;
  110.     D3DVALUE miny, maxy;
  111.     D3DVALUE height;
  112.     HRESULT rval;
  113.     view = view;
  114.     dev = dev;
  115.     camera = camera; /* unused */
  116.     if (FAILED(scene->lpVtbl->SetSceneBackground(scene, D3DRGB(D3DVAL(0.2), D3DVAL(0.2),
  117.                                       D3DVAL(0.2)))))
  118.       goto generic_error;
  119.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &light)))
  120. goto generic_error;
  121.     if (FAILED(light->lpVtbl->SetPosition(light, scene, D3DVAL(2.0), D3DVAL(3.0),
  122.                                D3DVAL(8.0))))
  123.        goto generic_error;
  124.     if (FAILED(light->lpVtbl->SetOrientation(light, scene, D3DVAL(-1.0), D3DVAL(-1.0),
  125.                                   D3DVAL(1.0), D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0))))
  126.   goto generic_error;
  127.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_DIRECTIONAL, D3DVAL(1),
  128.                                   D3DVAL(1), D3DVAL(1), &dlight)))
  129.   goto generic_error;
  130.     if (FAILED(light->lpVtbl->AddLight(light, dlight)))
  131. goto generic_error;
  132.     RELEASE(dlight);
  133.     RELEASE(light);
  134.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1),
  135.                                   D3DVAL(0.1), D3DVAL(0.1), &alight)))
  136.   goto generic_error;
  137.     if (FAILED(scene->lpVtbl->AddLight(scene, alight)))
  138. goto generic_error;
  139.     RELEASE(alight);
  140.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &box1)))
  141. goto generic_error;
  142.     if (FAILED(box1->lpVtbl->SetRotation(box1, scene, D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  143.       D3DVAL(-0.02))))
  144.       goto generic_error;
  145.     if (FAILED(box1->lpVtbl->SetPosition(box1, scene, D3DVAL(2.0), D3DVAL(0.0), D3DVAL(7.0))))
  146. goto generic_error;
  147.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder)))
  148. goto generic_error;
  149.     rval = builder->lpVtbl->Load(builder, "ncube.x", NULL,
  150.      D3DRMLOAD_FROMFILE, NULL, NULL);
  151.     if (rval != D3DRM_OK) {
  152.         Msg("Failed to load ncube.x.n");
  153. goto ret_with_error;
  154.     }
  155.     if (FAILED(builder->lpVtbl->SetPerspective(builder, TRUE)))
  156. goto generic_error;
  157.     if (FAILED(builder->lpVtbl->CreateMesh(builder, &obj)))
  158. goto generic_error;
  159.     RELEASE(builder);
  160.     if (FAILED(lpD3DRM->lpVtbl->CreateTexture(lpD3DRM, &checkImage, &tex)))
  161. goto generic_error;
  162.     if (FAILED(obj->lpVtbl->SetGroupTexture(obj, D3DRMGROUP_ALLGROUPS, tex)))
  163. goto generic_error;
  164.     if (FAILED(obj->lpVtbl->SetGroupMapping(obj, D3DRMGROUP_ALLGROUPS, D3DRMMAP_PERSPCORRECT)))
  165. goto generic_error;
  166.     if (FAILED(box1->lpVtbl->AddVisual(box1, (LPDIRECT3DRMVISUAL) obj)))
  167. goto generic_error;
  168.     if (FAILED(box1->lpVtbl->AddMoveCallback(box1, mutateTexture, tex)))
  169. goto generic_error;
  170.     RELEASE(obj);
  171.     RELEASE(tex);
  172.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &box2)))
  173. goto generic_error;
  174.     if (FAILED(box2->lpVtbl->SetRotation(box2, scene, D3DVAL(0.1), D3DVAL(1.0), D3DVAL(0.0),
  175.                               D3DVAL(0.1))))
  176.       goto generic_error;
  177.     if (FAILED(box2->lpVtbl->SetPosition(box2, box1, D3DVAL(-4.0), D3DVAL(0.0), D3DVAL(0.0))))
  178. goto generic_error;
  179.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder)))
  180. goto generic_error;
  181.     rval = builder->lpVtbl->Load(builder, "ncube.x", NULL,
  182.      D3DRMLOAD_FROMFILE, NULL, NULL);
  183.     if (rval != D3DRM_OK) {
  184.         Msg("Failed to load ncube.x.n");
  185. goto ret_with_error;
  186.     }
  187.     //builder->lpVtbl->Scale(builder, D3DVAL(2.0), D3DVAL(2.0), D3DVAL(2.0));
  188.     if (FAILED(builder->lpVtbl->SetPerspective(builder, TRUE)))
  189. goto generic_error;
  190.     if (FAILED(builder->lpVtbl->CreateMesh(builder, &obj)))
  191. goto generic_error;
  192.     RELEASE(builder);
  193.     rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "checker.ppm", &tex);
  194.     if (rval != D3DRM_OK) {
  195. Msg("Failed to load checker.ppm.n");
  196. goto ret_with_error;
  197.     }
  198.     if (FAILED(tex->lpVtbl->SetDecalTransparency(tex, TRUE)))
  199. goto generic_error;
  200.     if (FAILED(obj->lpVtbl->SetGroupTexture(obj, D3DRMGROUP_ALLGROUPS, tex)))
  201. goto generic_error;
  202.     if (FAILED(obj->lpVtbl->SetGroupMapping(obj, D3DRMGROUP_ALLGROUPS, D3DRMMAP_PERSPCORRECT)))
  203. goto generic_error;
  204.     if (FAILED(box2->lpVtbl->AddVisual(box2, (LPDIRECT3DRMVISUAL) obj)))
  205. goto generic_error;
  206.     RELEASE(obj);
  207.     RELEASE(tex);
  208.     RELEASE(box2);
  209.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &builder)))
  210. goto generic_error;
  211.     rval = builder->lpVtbl->Load(builder, "sphere3.x", NULL,
  212.      D3DRMLOAD_FROMFILE, NULL, NULL);
  213.     if (rval != D3DRM_OK) {
  214.         Msg("Failed to load sphere3.x.n");
  215. goto ret_with_error;
  216.     }
  217.     if (FAILED(builder->lpVtbl->CreateMesh(builder, &obj)))
  218. goto generic_error;
  219.     RELEASE(builder);
  220.     if (FAILED(obj->lpVtbl->GetBox(obj, &box)))
  221. goto generic_error;
  222.     maxy = box.max.y;
  223.     miny = box.min.y;
  224.     height = maxy - miny;
  225.     if (FAILED(lpD3DRM->lpVtbl->CreateWrap(lpD3DRM, D3DRMWRAP_CYLINDER, NULL,
  226.       D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0),
  227.       D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  228.       D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  229.       D3DVAL(0.0), D3DDivide(miny, height),
  230.               D3DVAL(1.0), D3DDivide(D3DVAL(-1.0),height),
  231.               &wrap)))
  232.       goto generic_error;
  233.     if (FAILED(wrap->lpVtbl->Apply(wrap, (LPDIRECT3DRMOBJECT) obj)))
  234. goto generic_error;
  235.     RELEASE(wrap);
  236.     rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "tex3.ppm", &sphereTex);
  237.     if (rval != D3DRM_OK) {
  238. Msg("Failed to load tex3.ppm.n");
  239. goto ret_with_error;
  240.     }
  241.     if (FAILED(sphereTex->lpVtbl->SetColors(sphereTex, 16)))
  242. goto generic_error;
  243.     if (FAILED(obj->lpVtbl->SetGroupTexture(obj, D3DRMGROUP_ALLGROUPS, sphereTex)))
  244. goto generic_error;
  245.     if (FAILED(lpD3DRM->lpVtbl->CreateMaterial(lpD3DRM, D3DVAL(16.0), &mat)))
  246. goto generic_error;
  247.     if (FAILED(obj->lpVtbl->SetGroupMaterial(obj, D3DRMGROUP_ALLGROUPS, mat)))
  248. goto generic_error;
  249.     RELEASE(sphereTex);
  250.     RELEASE(mat);
  251.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &sphere)))
  252. goto generic_error;
  253.     if (FAILED(sphere->lpVtbl->AddVisual(sphere, (LPDIRECT3DRMVISUAL) obj)))
  254. goto generic_error;
  255.     RELEASE(obj);
  256.     if (FAILED(sphere->lpVtbl->SetPosition(sphere, scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(8.0))))
  257. goto generic_error;
  258.     if (FAILED(sphere->lpVtbl->SetRotation(sphere, scene, D3DVAL(-0.1), D3DVAL(1.0),
  259.                         D3DVAL(0.0), D3DVAL(0.02))))
  260. goto generic_error;
  261.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, sphere, &decal)))
  262. goto generic_error;
  263.     rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "checker.ppm", &decalTex);
  264.     if (rval != D3DRM_OK) {
  265. Msg("Failed to load checker.ppm.n");
  266. goto ret_with_error;
  267.     }
  268.     if (FAILED(decalTex->lpVtbl->SetDecalScale(decalTex, TRUE)))
  269. goto generic_error;
  270.     if (FAILED(decalTex->lpVtbl->SetDecalSize(decalTex, D3DVAL(2.0), D3DVAL(2.0))))
  271. goto generic_error;
  272.     if (FAILED(decalTex->lpVtbl->SetDecalOrigin(decalTex, 4, 4)))
  273. goto generic_error;
  274.     if (FAILED(decalTex->lpVtbl->SetDecalTransparency(decalTex, TRUE)))
  275. goto generic_error;
  276.     if (FAILED(decal->lpVtbl->SetPosition(decal, sphere, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(2.0))))
  277. goto generic_error;
  278.     if (FAILED(decal->lpVtbl->AddVisual(decal, (LPDIRECT3DRMVISUAL) decalTex)))
  279. goto generic_error;
  280.     RELEASE(decalTex);
  281.     RELEASE(box1);
  282.     RELEASE(decal);
  283.     RELEASE(sphere);
  284.     return TRUE;
  285. generic_error:
  286.     Msg("A failure occurred while building the scene.n");
  287. ret_with_error:
  288.     RELEASE(box1);
  289.     RELEASE(box2);
  290.     RELEASE(sphere);
  291.     RELEASE(decal);
  292.     RELEASE(light);
  293.     RELEASE(obj);
  294.     RELEASE(dlight);
  295.     RELEASE(alight);
  296.     RELEASE(tex);
  297.     RELEASE(builder);
  298.     RELEASE(wrap);
  299.     RELEASE(sphereTex);
  300.     RELEASE(decalTex);
  301.     RELEASE(mat);
  302.     return FALSE;
  303. }
  304. void
  305. OverrideDefaults(Defaults* defaults)
  306. {
  307.     defaults->bConstRenderQuality = TRUE;
  308.     lstrcpy(defaults->Name, "Transparency Direct3DRM Example");
  309. }