home *** CD-ROM | disk | FTP | other *** search
/ The Net: Ultimate Internet Guide / WWLCD1.ISO / pc / directx2 / sdk / samples / globe / globe.c next >
Encoding:
C/C++ Source or Header  |  1996-05-28  |  8.0 KB  |  227 lines

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: globe.c
  6.  *
  7.  ***************************************************************************/
  8.  
  9. #include "rmdemo.h"
  10.  
  11. D3DRMRENDERQUALITY quality = D3DRMRENDER_GOURAUD;
  12.  
  13. LPDIRECT3DRMANIMATION anim;
  14. int motion_points = 17;
  15.  
  16. D3DVECTOR motion[17] =
  17. {{-D3DVAL(14), D3DVAL(4), D3DVAL(45)},
  18. {D3DVAL(9), -D3DVAL(3), D3DVAL(36)},
  19. {D3DVAL(5), D3DVAL(0), D3DVAL(5)},
  20. {-D3DVAL(5), D3DVAL(8), D3DVAL(25)},
  21. {D3DVAL(0), D3DVAL(3), D3DVAL(20)},
  22. {-D3DVAL(3), -D3DVAL(4), D3DVAL(10)},
  23. {D3DVAL(8), D3DVAL(10), D3DVAL(15)},
  24. {D3DVAL(16), D3DVAL(0), D3DVAL(30)},
  25. {D3DVAL(10), -D3DVAL(4), D3DVAL(42)},
  26. {-D3DVAL(15), D3DVAL(0), D3DVAL(37)},
  27. {-D3DVAL(5), -D3DVAL(7), D3DVAL(15)},
  28. {D3DVAL(5), D3DVAL(5), D3DVAL(20)},
  29. {D3DVAL(5), D3DVAL(10), D3DVAL(30)},
  30. {D3DVAL(13), D3DVAL(8), D3DVAL(50)},
  31. {D3DVAL(0), D3DVAL(8), D3DVAL(25)},
  32. {D3DVAL(0), D3DVAL(0), D3DVAL(20)},
  33. {-D3DVAL(14), D3DVAL(4), D3DVAL(45)}
  34. };
  35.  
  36. static void cleanupPath(LPDIRECT3DRMOBJECT obj, void* arg)
  37. {
  38.     anim->lpVtbl->Release(anim);
  39. }
  40.  
  41. void 
  42. moveCamera(LPDIRECT3DRMFRAME frame, void *arg, D3DVALUE delta)
  43. {
  44.     static D3DVALUE t = D3DVAL(0.0);
  45.     LPDIRECT3DRMFRAME world_frame = (LPDIRECT3DRMFRAME) arg;
  46.     LPDIRECT3DRMFRAME scene;
  47.  
  48.     frame->lpVtbl->GetScene(frame, &scene);
  49.  
  50.     t += D3DVAL(0.08);
  51.     anim->lpVtbl->SetFrame(anim, frame);
  52.     anim->lpVtbl->SetTime(anim, t);
  53.  
  54.     frame->lpVtbl->LookAt(frame, world_frame, scene, D3DRMCONSTRAIN_Z);
  55.  
  56.     scene->lpVtbl->Release(scene);
  57. }
  58.  
  59. /*
  60.  * world_scene
  61.  */
  62. BOOL
  63. run_world_scene(LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera)
  64. {
  65.     LPDIRECT3DRMFRAME light1 = NULL;
  66.     LPDIRECT3DRMFRAME world_frame = NULL;
  67.     LPDIRECT3DRMLIGHT l1 = NULL;
  68.     LPDIRECT3DRMLIGHT l2 = NULL;
  69.     LPDIRECT3DRMTEXTURE tex = NULL;
  70.     LPDIRECT3DRMWRAP wrap = NULL;
  71.     LPDIRECT3DRMMESHBUILDER sphere3_builder = NULL;
  72.     LPDIRECT3DRMMATERIAL mat = NULL;
  73.     HRESULT rval;
  74.     D3DRMBOX box;
  75.     D3DVALUE miny, maxy, height;
  76.  
  77.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &light1)))
  78.         goto generic_error;
  79.     if (FAILED(light1->lpVtbl->SetPosition(light1, scene, D3DVAL(2), D3DVAL(0.0), D3DVAL(22))))
  80.         goto generic_error;
  81.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_DIRECTIONAL, D3DVAL(0.9),
  82.                                   D3DVAL(0.9), D3DVAL(0.9), &l1)))
  83.                                   goto generic_error;
  84.     if (FAILED(light1->lpVtbl->AddLight(light1, l1)))
  85.         goto generic_error;
  86.     if (FAILED(lpD3DRM->lpVtbl->CreateLightRGB(lpD3DRM, D3DRMLIGHT_AMBIENT, D3DVAL(0.1),
  87.                                   D3DVAL(0.1), D3DVAL(0.1), &l2)))
  88.                                   goto generic_error;
  89.     if (FAILED(scene->lpVtbl->AddLight(scene, l2)))
  90.         goto generic_error;
  91.     if (FAILED(camera->lpVtbl->SetPosition(camera, scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0))))
  92.         goto generic_error;
  93.     if (FAILED(camera->lpVtbl->SetOrientation(camera, scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1), D3DVAL(0.0),
  94.                                                 D3DVAL(1), D3DVAL(0.0))))
  95.                                                 goto generic_error;
  96.  
  97.     if (FAILED(lpD3DRM->lpVtbl->CreateFrame(lpD3DRM, scene, &world_frame)))
  98.         goto generic_error;
  99.     if (FAILED(world_frame->lpVtbl->SetPosition(world_frame, scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(30))))
  100.         goto generic_error;
  101.     if (FAILED(world_frame->lpVtbl->SetOrientation(world_frame, scene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1),
  102.                                         D3DVAL(0.0), D3DVAL(1), D3DVAL(0.0))))
  103.                                         goto generic_error;
  104.     if (FAILED(world_frame->lpVtbl->SetRotation(world_frame, scene, D3DVAL(0.03), 
  105.                                      D3DVAL(0.1), D3DVAL(0.0), D3DVAL(0.1))))
  106.                                      goto generic_error;
  107.  
  108.     if (FAILED(lpD3DRM->lpVtbl->CreateMeshBuilder(lpD3DRM, &sphere3_builder)))
  109.         goto generic_error;
  110.     rval = sphere3_builder->lpVtbl->Load(sphere3_builder, "sphere3.x",
  111.                                         NULL, D3DRMLOAD_FROMFILE, NULL, NULL);
  112.     if (rval != D3DRM_OK) {
  113.         Msg("Failed to load sphere3_builder.\n%s", D3DRMErrorToString(rval));
  114.         goto ret_with_error;
  115.     }
  116.     if (FAILED(lpD3DRM->lpVtbl->CreateMaterial(lpD3DRM, D3DVAL(20.0), &mat)))
  117.         goto generic_error;
  118.     if (FAILED(sphere3_builder->lpVtbl->SetMaterial(sphere3_builder, mat)))
  119.         goto generic_error;
  120.     mat->lpVtbl->Release(mat);
  121.     if (FAILED(sphere3_builder->lpVtbl->Scale(sphere3_builder,
  122.                                    D3DVAL(2), D3DVAL(2), D3DVAL(2))))
  123.                                    goto generic_error;
  124.  
  125.     if (FAILED(sphere3_builder->lpVtbl->SetColorRGB(sphere3_builder, D3DVAL(1), D3DVAL(1), D3DVAL(1))))
  126.         goto generic_error;
  127.     if (FAILED(sphere3_builder->lpVtbl->GetBox(sphere3_builder, &box)))
  128.         goto generic_error;
  129.     maxy = box.max.y;
  130.     miny = box.min.y;
  131.     height = maxy - miny;
  132.  
  133.     if (FAILED(lpD3DRM->lpVtbl->CreateWrap
  134.         (lpD3DRM, D3DRMWRAP_CYLINDER, NULL,
  135.          D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0),
  136.          D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  137.          D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  138.          D3DVAL(0.0), D3DDivide(miny, height),
  139.          D3DVAL(1.0), D3DDivide(-D3DVAL(1.0), height),
  140.          &wrap
  141.         )))
  142.         goto generic_error;
  143.     if (FAILED(wrap->lpVtbl->Apply(wrap, (LPDIRECT3DRMOBJECT) sphere3_builder)))
  144.         goto generic_error;
  145.  
  146.     rval = lpD3DRM->lpVtbl->LoadTexture(lpD3DRM, "tex1.ppm", &tex);
  147.     if (rval != D3DRM_OK) {
  148.         Msg("Failed to load rllogo.ppm\n%s", D3DRMErrorToString(rval));
  149.         goto ret_with_error;
  150.     }
  151.     if (FAILED(tex->lpVtbl->SetShades(tex, 32)))
  152.         goto generic_error;
  153.     if (FAILED(sphere3_builder->lpVtbl->SetTexture(sphere3_builder, tex)))
  154.         goto generic_error;
  155.  
  156.     if (FAILED(world_frame->lpVtbl->AddVisual(world_frame, (LPDIRECT3DRMVISUAL) sphere3_builder)))
  157.         goto generic_error;
  158.  
  159.     if (FAILED(camera->lpVtbl->AddMoveCallback(camera, moveCamera, 
  160.                                     (void *) world_frame)))
  161.                                     goto generic_error;
  162.     if (FAILED(camera->lpVtbl->AddDestroyCallback(camera, cleanupPath, NULL)))
  163.         goto generic_error;
  164.  
  165.     RELEASE(light1);
  166.     RELEASE(world_frame);
  167.     RELEASE(sphere3_builder);
  168.     RELEASE(l1);
  169.     RELEASE(l2);
  170.     RELEASE(tex);
  171.     RELEASE(wrap);
  172.     return TRUE;
  173. generic_error:
  174.     Msg("An error occured while building the scene.\n");
  175. ret_with_error:
  176.     RELEASE(light1);
  177.     RELEASE(world_frame);
  178.     RELEASE(l1);
  179.     RELEASE(l2);
  180.     RELEASE(tex);
  181.     RELEASE(wrap);
  182.     RELEASE(sphere3_builder);
  183.     RELEASE(mat);
  184.     return FALSE;
  185. }
  186.  
  187. BOOL
  188. BuildScene(LPDIRECT3DRMDEVICE dev, LPDIRECT3DRMVIEWPORT view,
  189.            LPDIRECT3DRMFRAME scene, LPDIRECT3DRMFRAME camera)
  190. {
  191.     int i;
  192.  
  193.     view = view;                /* not used */
  194.  
  195.     /*
  196.      * This example flys a camera around a globe. The path taken is
  197.      * defined by a spline curve.
  198.      */
  199.  
  200.  
  201.     if (FAILED(dev->lpVtbl->SetQuality(dev, quality)))
  202.         goto generic_error;
  203.  
  204.     if (FAILED(lpD3DRM->lpVtbl->CreateAnimation(lpD3DRM, &anim)))
  205.         goto generic_error;
  206.     if (FAILED(anim->lpVtbl->SetOptions(anim, D3DRMANIMATION_CLOSED | D3DRMANIMATION_LINEARPOSITION | D3DRMANIMATION_POSITION)))
  207.         goto generic_error;
  208.     for (i = 0; i < motion_points; i++) {
  209.         if (FAILED(anim->lpVtbl->AddPositionKey(anim, D3DVAL(i), motion[i].x, motion[i].y,
  210.                                  motion[i].z/2)))
  211.                                  goto generic_error;
  212.     }
  213.     if (!run_world_scene(scene, camera))
  214.         goto ret_with_error;
  215.     return TRUE;
  216. generic_error:
  217.     Msg("A failure occured while building the scene.\n");
  218. ret_with_error:
  219.     return FALSE;
  220. }
  221.  
  222. void
  223. OverrideDefaults(Defaults* defaults)
  224. {
  225.     lstrcpy(defaults->Name, "Globe Direct3DRM Example");
  226. }
  227.