home *** CD-ROM | disk | FTP | other *** search
/ NEXT Generation 27 / NEXT27.iso / pc / demos / emperor / dx3.exe / SDK / SAMPLES / VIEWER / SEL.CPP < prev    next >
C/C++ Source or Header  |  1996-08-28  |  6KB  |  251 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 LPDIRECT3DRMMESHBUILDER 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. LPDIRECT3DRMMESHBUILDER 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(LPDIRECT3DRMMESHBUILDER 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 builder;
  83.  
  84.             sVisual->GetBox(&box);
  85.             builder = makeBox(&box);
  86.             builder->CreateMesh(&selectionBox);
  87.             sFrame->AddVisual(selectionBox);
  88.             selectionBox->Release();
  89.         }
  90.     }
  91. }
  92.  
  93. void FindAndSelectVisual(LPDIRECT3DRMVIEWPORT view, int x, int y)
  94. {
  95.     LPDIRECT3DRMVISUAL visual;
  96.     LPDIRECT3DRMFRAME frame;
  97.     LPDIRECT3DRMPICKEDARRAY picked;
  98.     LPDIRECT3DRMFRAMEARRAY frames;
  99.     LPDIRECT3DRMMESHBUILDER mesh;
  100.  
  101.     /*
  102.      * Make sure we don't try to select the selection box of the current
  103.      * selection.
  104.      */
  105.     DeselectVisual();
  106.  
  107.     view->Pick(x, y, &picked);
  108.     if (picked)
  109.     {   if (picked->GetSize())
  110.         {
  111.             picked->GetPick(0, &visual, &frames, 0);
  112.             frames->GetElement(frames->GetSize() - 1, &frame);
  113.  
  114.             if (SUCCEEDED(visual->QueryInterface(IID_IDirect3DRMMeshBuilder, (void **) &mesh)))
  115.             {   SelectVisual(mesh, frame);
  116.                 mesh->Release();
  117.             }
  118.  
  119.             frame->Release();
  120.             frames->Release();
  121.             visual->Release();
  122.         }
  123.         picked->Release();
  124.     }
  125. }
  126.  
  127. void CutVisual()
  128. {
  129.     LPDIRECT3DRMFRAME frame;
  130.  
  131.     if (clipboardFrame)
  132.         clipboardFrame->Release();
  133.  
  134.     if (sFrame) {
  135.         clipboardFrame = sFrame;
  136.         clipboardVisual = sVisual;
  137.  
  138.         DeselectVisual();
  139.  
  140.         clipboardFrame->AddRef();
  141.         clipboardFrame->GetParent(&frame);
  142.         if (frame) {
  143.             frame->DeleteChild(clipboardFrame);
  144.             frame->Release();
  145.         }
  146.     }
  147. }
  148.  
  149. void CopyVisual()
  150. {
  151.     LPDIRECT3DRMFRAME frame;
  152.  
  153.     if (clipboardFrame)
  154.         clipboardFrame->Release();
  155.  
  156.     if (sFrame) {
  157.         sFrame->Clone(0, IID_IDirect3DRMFrame, (void **) &clipboardFrame);
  158.         sVisual->Clone(0, IID_IDirect3DRMVisual, (void **) &clipboardVisual);
  159.  
  160.         clipboardFrame->AddVisual(clipboardVisual);
  161.         clipboardVisual->Release();
  162.  
  163.         clipboardFrame->GetParent(&frame);
  164.         if (frame) {
  165.             frame->DeleteChild(clipboardFrame);
  166.             frame->Release();
  167.         }
  168.     }
  169. }
  170.  
  171. void PasteVisual(LPDIRECT3DRMFRAME scene)
  172. {
  173.     if (clipboardFrame)
  174.     {
  175.         LPDIRECT3DRMFRAME frame;
  176.         LPDIRECT3DRMVISUAL visual;
  177.  
  178.         clipboardFrame->Clone(0, IID_IDirect3DRMFrame, (void **) &frame);
  179.         clipboardVisual->Clone(0, IID_IDirect3DRMVisual, (void **) &visual);
  180.  
  181.         frame->AddVisual(visual);
  182.         scene->AddChild(frame);
  183.         visual->Release();
  184.         frame->Release();
  185.     }
  186. }
  187.  
  188. void DeleteVisual()
  189. {
  190.     if (sFrame)
  191.     {
  192.         LPDIRECT3DRMFRAME parent, frame = sFrame;
  193.  
  194.         DeselectVisual();
  195.         frame->GetParent(&parent);
  196.         parent->DeleteChild(frame);
  197.         parent->Release();
  198.     }
  199. }
  200.  
  201. void ClearClipboard()
  202. {
  203.     if (clipboardFrame)
  204.         clipboardFrame->Release();
  205. }
  206.  
  207. static LPDIRECT3DRMMESHBUILDER makeBox(D3DRMBOX* box)
  208. {
  209.     LPDIRECT3DRMMESHBUILDER mesh;
  210.     static D3DVECTOR zero = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)};
  211.     static D3DVECTOR dir = {D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0)};
  212.     D3DVECTOR a, b;
  213.  
  214.     lpD3DRM->CreateMeshBuilder(&mesh);
  215.  
  216.     dir.z = box->max.z + D3DVAL(1.0);
  217.     AddRod(mesh, D3DVAL(0.05), zero, dir);
  218.     a = dir;
  219.     a.z += D3DVAL(0.6);
  220.     AddCone(mesh, D3DVAL(0.2), dir, a);
  221.     a = box->min;
  222.     b = a;
  223.     b.y = box->max.y;
  224.     AddRod(mesh, D3DVAL(0.05), a, b);
  225.     a = b; b.x = box->max.x;
  226.     AddRod(mesh, D3DVAL(0.05), a, b);
  227.     a = b; b.y = box->min.y;
  228.     AddRod(mesh, D3DVAL(0.05), a, b);
  229.     a = b; b.x = box->min.x;
  230.     AddRod(mesh, D3DVAL(0.05), a, b);
  231.     a = b; b.z = box->max.z;
  232.     AddRod(mesh, D3DVAL(0.05), a, b);
  233.     a = b; b.x = box->max.x;
  234.     AddRod(mesh, D3DVAL(0.05), a, b);
  235.     a = b; b.y = box->max.y;
  236.     AddRod(mesh, D3DVAL(0.05), a, b);
  237.     a = b; b.x = box->min.x;
  238.     AddRod(mesh, D3DVAL(0.05), a, b);
  239.     a = b; b.y = box->min.y;
  240.     AddRod(mesh, D3DVAL(0.05), a, b);
  241.     b.y = box->max.y; a = b; b.z = box->min.z;
  242.     AddRod(mesh, D3DVAL(0.05), a, b);
  243.     a = b = box->max; b.z = box->min.z;
  244.     AddRod(mesh, D3DVAL(0.05), a, b);
  245.     a.y = box->min.y; b = a; b.z = box->min.z;
  246.     AddRod(mesh, D3DVAL(0.05), a, b);
  247.  
  248.     mesh->SetColor(D3DRMCreateColorRGB(D3DVAL(1.0), D3DVAL(1.0), D3DVAL(1.0)));
  249.     return mesh;
  250. }
  251.