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

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