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

Windows编程

开发平台:

Visual C++

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