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 / viewer / sel.cpp < prev    next >
C/C++ Source or Header  |  1997-07-14  |  7KB  |  313 lines

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  4.  *
  5.  *  File: sel.cpp
  6.  *
  7.  ***************************************************************************/
  8.  
  9. #include <math.h>
  10. #include <d3drmwin.h>
  11. #include "sel.h"
  12. #include "rodcone.h"
  13. #include "viewer.h"
  14.  
  15. static int showBoxes = FALSE;
  16. static LPDIRECT3DRMFRAME sFrame = NULL;
  17. static LPDIRECT3DRMVISUAL sVisual = NULL;
  18. static LPDIRECT3DRMLIGHT sLight = NULL;
  19. static LPDIRECT3DRMMESH selectionBox = NULL;
  20. static LPDIRECT3DRMMESHBUILDER makeBox(D3DRMBOX*);
  21.  
  22. LPDIRECT3DRMFRAME clipboardFrame = NULL;
  23. LPDIRECT3DRMVISUAL clipboardVisual = NULL;
  24.  
  25. void ShowBoxes(int show)
  26. {
  27.     showBoxes = show;
  28.     SelectVisual(sVisual, sFrame);
  29. }
  30.  
  31. int ToggleBoxes()
  32. {
  33.     ShowBoxes(!showBoxes);
  34.     return showBoxes;
  35. }
  36.  
  37. LPDIRECT3DRMFRAME SelectedFrame()
  38. {
  39.     return sFrame;
  40. }
  41.  
  42. LPDIRECT3DRMVISUAL SelectedVisual()
  43. {
  44.     return sVisual;
  45. }
  46.  
  47. LPDIRECT3DRMLIGHT SelectedLight()
  48. {
  49.     return sLight;
  50. }
  51.  
  52. void DeselectVisual()
  53. {
  54.     if (sFrame && selectionBox)
  55.     sFrame->DeleteVisual(selectionBox);
  56.     sFrame = NULL;
  57.     sVisual = NULL;
  58.     selectionBox = NULL;
  59. }
  60.  
  61. void SelectVisual(LPDIRECT3DRMVISUAL visual, LPDIRECT3DRMFRAME frame)
  62. {
  63.     DeselectVisual();
  64.     sVisual = visual;
  65.     sFrame = frame;
  66.  
  67.     if (sVisual)
  68.     {    LPDIRECT3DRMLIGHTARRAY lights;
  69.  
  70.     sLight = 0;
  71.     sFrame->GetLights(&lights);
  72.     if (lights)
  73.     {   if (lights->GetSize())
  74.         {    lights->GetElement(0, &sLight);
  75.         sLight->Release(); /* reinstate reference count */
  76.         }
  77.         lights->Release();
  78.     }
  79.  
  80.     if (showBoxes && visual)
  81.     {   D3DRMBOX box;
  82.         LPDIRECT3DRMMESHBUILDER lpMeshVis;
  83.         LPDIRECT3DRMPROGRESSIVEMESH lpProgMeshVis;
  84.         LPDIRECT3DRMMESHBUILDER builder;
  85.  
  86.         if (SUCCEEDED(visual->QueryInterface(IID_IDirect3DRMProgressiveMesh,
  87.                          (LPVOID*) &lpProgMeshVis)))
  88.         {
  89.         lpProgMeshVis->GetBox(&box);
  90.         lpProgMeshVis->Release();
  91.         }
  92.  
  93.         if (SUCCEEDED(visual->QueryInterface(IID_IDirect3DRMMeshBuilder,
  94.                              (LPVOID*) &lpMeshVis)))
  95.         {   
  96.         lpMeshVis->GetBox(&box);
  97.         lpMeshVis->Release();
  98.         }
  99.         builder = makeBox(&box);
  100.         builder->CreateMesh(&selectionBox);
  101.         sFrame->AddVisual(selectionBox);
  102.         selectionBox->Release();
  103.     }
  104.     }
  105. }
  106.  
  107. void SelectPM(LPDIRECT3DRMPROGRESSIVEMESH lpPM)
  108. {
  109.     float fVal;
  110.     HRESULT hres;
  111.     HWND win = active_window->win;
  112.  
  113.     if (!lpPM)
  114.     {
  115.     if (active_window->lpPM)
  116.     {
  117.         active_window->lpPM->Release();
  118.         active_window->lpPM = NULL;
  119.         EnableScrollBar(win, SB_VERT, ESB_DISABLE_BOTH);
  120.     }
  121.     return;
  122.     }
  123.     
  124.     lpPM->AddRef();
  125.     
  126.     if (active_window->lpPM)
  127.     {
  128.     active_window->lpPM->Release();
  129.     }
  130.  
  131.     active_window->lpPM = lpPM;
  132.  
  133.     hres = lpPM->GetDetail(&fVal);
  134.     if (SUCCEEDED(hres))
  135.     {
  136.     SetScrollPos(win, SB_VERT, (DWORD)(100.0 - (DWORD)(fVal * 100.0)), TRUE);
  137.     gfVal = fVal;
  138.     }
  139.     
  140.     EnableScrollBar(win, SB_VERT, ESB_ENABLE_BOTH);
  141. }
  142.  
  143. void FindAndSelectVisual(LPDIRECT3DRMVIEWPORT view, int x, int y)
  144. {
  145.     LPDIRECT3DRMVISUAL visual;
  146.     LPDIRECT3DRMFRAME frame;
  147.     LPDIRECT3DRMPICKEDARRAY picked;
  148.     LPDIRECT3DRMFRAMEARRAY frames;
  149.     LPDIRECT3DRMMESHBUILDER mesh;
  150.  
  151.     /*
  152.      * Make sure we don't try to select the selection box of the current
  153.      * selection.
  154.      */
  155.     DeselectVisual();
  156.  
  157.     view->Pick(x, y, &picked);
  158.     if (picked)
  159.     {    if (picked->GetSize())
  160.     {
  161.         LPDIRECT3DRMPROGRESSIVEMESH pm;
  162.  
  163.         picked->GetPick(0, &visual, &frames, 0);
  164.         frames->GetElement(frames->GetSize() - 1, &frame);
  165.  
  166.         if (SUCCEEDED(visual->QueryInterface(IID_IDirect3DRMProgressiveMesh,
  167.                          (LPVOID*) &pm))) {
  168.         SelectPM(pm);
  169.             pm->Release();
  170.             SelectVisual(pm, frame);
  171.         }
  172.  
  173.         if (SUCCEEDED(visual->QueryInterface(IID_IDirect3DRMMeshBuilder, (void **) &mesh)))
  174.         {   
  175.         SelectPM(NULL);
  176.         SelectVisual(mesh, frame);
  177.         mesh->Release();
  178.         }
  179.  
  180.         frame->Release();
  181.         frames->Release();
  182.         visual->Release();
  183.     }
  184.     picked->Release();
  185.     }
  186. }
  187.  
  188. void CutVisual()
  189. {
  190.     LPDIRECT3DRMFRAME frame;
  191.  
  192.     if (clipboardFrame)
  193.     clipboardFrame->Release();
  194.  
  195.     if (sFrame) {
  196.     clipboardFrame = sFrame;
  197.     clipboardVisual = sVisual;
  198.  
  199.     DeselectVisual();
  200.  
  201.     clipboardFrame->AddRef();
  202.     clipboardFrame->GetParent(&frame);
  203.     if (frame) {
  204.         frame->DeleteChild(clipboardFrame);
  205.         frame->Release();
  206.     }
  207.     }
  208. }
  209.  
  210. void CopyVisual()
  211. {
  212.     LPDIRECT3DRMFRAME frame;
  213.  
  214.     if (clipboardFrame)
  215.     clipboardFrame->Release();
  216.  
  217.     if (sFrame) {
  218.     sFrame->Clone(0, IID_IDirect3DRMFrame, (void **) &clipboardFrame);
  219.     sVisual->Clone(0, IID_IDirect3DRMVisual, (void **) &clipboardVisual);
  220.  
  221.     clipboardFrame->AddVisual(clipboardVisual);
  222.     clipboardVisual->Release();
  223.  
  224.     clipboardFrame->GetParent(&frame);
  225.     if (frame) {
  226.         frame->DeleteChild(clipboardFrame);
  227.         frame->Release();
  228.     }
  229.     }
  230. }
  231.  
  232. void PasteVisual(LPDIRECT3DRMFRAME scene)
  233. {
  234.     if (clipboardFrame)
  235.     {
  236.     LPDIRECT3DRMFRAME frame;
  237.     LPDIRECT3DRMVISUAL visual;
  238.  
  239.     clipboardFrame->Clone(0, IID_IDirect3DRMFrame, (void **) &frame);
  240.     clipboardVisual->Clone(0, IID_IDirect3DRMVisual, (void **) &visual);
  241.  
  242.     frame->AddVisual(visual);
  243.     scene->AddChild(frame);
  244.     visual->Release();
  245.     frame->Release();
  246.     }
  247. }
  248.  
  249. void DeleteVisual()
  250. {
  251.     if (sFrame)
  252.     {
  253.     LPDIRECT3DRMFRAME parent, frame = sFrame;
  254.  
  255.     DeselectVisual();
  256.     SelectPM(NULL);
  257.     frame->GetParent(&parent);
  258.     parent->DeleteChild(frame);
  259.     parent->Release();
  260.     }
  261. }
  262.  
  263. void ClearClipboard()
  264. {
  265.     if (clipboardFrame)
  266.     clipboardFrame->Release();
  267. }
  268.  
  269. static LPDIRECT3DRMMESHBUILDER makeBox(D3DRMBOX* box)
  270. {
  271.     LPDIRECT3DRMMESHBUILDER2 mesh;
  272.     static D3DVECTOR zero = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)};
  273.     static D3DVECTOR dir = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)};
  274.     D3DVECTOR a, b;
  275.  
  276.     lpD3DRM->CreateMeshBuilder(&mesh);
  277.  
  278.     dir.z = box->max.z + D3DVAL(1.0);
  279.     AddRod(mesh, D3DVAL(0.05), zero, dir);
  280.     a = dir;
  281.     a.z += D3DVAL(0.6);
  282.     AddCone(mesh, D3DVAL(0.2), dir, a);
  283.     a = box->min;
  284.     b = a;
  285.     b.y = box->max.y;
  286.     AddRod(mesh, D3DVAL(0.05), a, b);
  287.     a = b; b.x = box->max.x;
  288.     AddRod(mesh, D3DVAL(0.05), a, b);
  289.     a = b; b.y = box->min.y;
  290.     AddRod(mesh, D3DVAL(0.05), a, b);
  291.     a = b; b.x = box->min.x;
  292.     AddRod(mesh, D3DVAL(0.05), a, b);
  293.     a = b; b.z = box->max.z;
  294.     AddRod(mesh, D3DVAL(0.05), a, b);
  295.     a = b; b.x = box->max.x;
  296.     AddRod(mesh, D3DVAL(0.05), a, b);
  297.     a = b; b.y = box->max.y;
  298.     AddRod(mesh, D3DVAL(0.05), a, b);
  299.     a = b; b.x = box->min.x;
  300.     AddRod(mesh, D3DVAL(0.05), a, b);
  301.     a = b; b.y = box->min.y;
  302.     AddRod(mesh, D3DVAL(0.05), a, b);
  303.     b.y = box->max.y; a = b; b.z = box->min.z;
  304.     AddRod(mesh, D3DVAL(0.05), a, b);
  305.     a = b = box->max; b.z = box->min.z;
  306.     AddRod(mesh, D3DVAL(0.05), a, b);
  307.     a.y = box->min.y; b = a; b.z = box->min.z;
  308.     AddRod(mesh, D3DVAL(0.05), a, b);
  309.  
  310.     mesh->SetColor(D3DRMCreateColorRGB(D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0)));
  311.     return mesh;
  312. }
  313.