3 using System.Windows.Media;
4 using System.Windows.Interop;
5 using System.Runtime.InteropServices;
10 /// Tool object for output OCCT rendering with Direct3D.
14 /// <summary> Direct3D renderer. </summary>
15 private IntPtr myD3DRender;
17 /// <summary> Direct3D output image. </summary>
18 private D3DImage myD3DImage = new D3DImage ();
20 /// <summary> Direct3D color surface. </summary>
21 private IntPtr myColorSurf;
23 public OCCViewer Viewer;
25 /// <summary> Creates new Direct3D-based OCCT viewer. </summary>
28 myD3DImage.IsFrontBufferAvailableChanged
29 += new DependencyPropertyChangedEventHandler (OnIsFrontBufferAvailableChanged);
31 BeginRenderingScene ();
34 /// <summary> Creates new Direct3D-based OCCT viewer. </summary>
35 private void OnIsFrontBufferAvailableChanged (object sender, DependencyPropertyChangedEventArgs e)
37 // If the front buffer is available, then WPF has just created a new
38 // Direct3D device, thus we need to start rendering our custom scene
39 if (myD3DImage.IsFrontBufferAvailable)
41 BeginRenderingScene ();
45 // If the front buffer is no longer available, then WPF has lost Direct3D
46 // device, thus we need to stop rendering until the new device is created
47 StopRenderingScene ();
51 private bool myIsFailed = false;
53 /// <summary> Initializes Direct3D-OCCT rendering. </summary>
54 private void BeginRenderingScene ()
61 if (myD3DImage.IsFrontBufferAvailable)
66 // Initialize Direct3D device and render target
67 myD3DRender = Direct3DProxy.InitRender(out aWinHandle, out aD3DDevice);
69 Viewer = new OCCViewer();
71 if (!Viewer.InitInterop (aWinHandle, aD3DDevice))
73 MessageBox.Show ("Failed to initialize OpenGL-Direct3D interoperability!",
74 "Error", MessageBoxButton.OK, MessageBoxImage.Error);
78 if (myD3DRender != IntPtr.Zero)
79 Direct3DProxy.ReleaseRender(ref myD3DRender);
84 // Leverage the Rendering event of WPF composition
85 // target to update the our custom Direct3D scene
86 CompositionTarget.Rendering += OnRendering;
90 /// <summary> Initializes Direct3D-OCCT rendering. </summary>
91 public void StopRenderingScene ()
93 // This method is called when WPF loses its Direct3D device,
94 // so we should just release our custom Direct3D scene
95 CompositionTarget.Rendering -= OnRendering;
97 if (myD3DRender != IntPtr.Zero)
98 Direct3DProxy.ReleaseRender(ref myD3DRender);
100 myColorSurf = IntPtr.Zero;
103 /// <summary> Initializes Direct3D-OCCT rendering. </summary>
104 private void OnRendering (object sender, EventArgs e)
109 /// <summary> Current size of rendering window. </summary>
110 private WndSize mySize = new WndSize(1, 1);
112 /// <summary> Initializes Direct3D-OCCT rendering. </summary>
113 private void UpdateScene ()
115 if (!myIsFailed && myD3DImage.IsFrontBufferAvailable && myColorSurf != IntPtr.Zero)
119 // Update the scene (via a call into our custom library)
120 Viewer.View.RedrawView ();
122 // Invalidate the updated region of the D3DImage
123 myD3DImage.AddDirtyRect(new Int32Rect(0, 0, mySize.cx, mySize.cy));
125 myD3DImage.Unlock ();
129 /// <summary> Resizes Direct3D surfaces and OpenGL FBO. </summary>
130 public void Resize (int theSizeX, int theSizeY)
132 mySize = new WndSize(theSizeX, theSizeY);
134 if (!myIsFailed && myD3DImage.IsFrontBufferAvailable)
136 IntPtr aColorSurfShare;
138 // Initialize Direct3D device and render target
139 Direct3DProxy.ResizeWindow(ref myD3DRender, ref mySize, out myColorSurf, out aColorSurfShare);
141 // Set the back buffer for Direct3D WPF image
144 myD3DImage.SetBackBuffer (D3DResourceType.IDirect3DSurface9, myColorSurf);
146 myD3DImage.Unlock ();
148 Viewer.View.ResizeBridgeFBO(mySize.cx, mySize.cy, myColorSurf, aColorSurfShare);
152 public D3DImage Image