1 #include "pch.h"
2 #include "Direct3DInterop.h"
3 #include "Direct3DContentProvider.h"
4 #include <windows.storage.streams.h>
5 #include <wrl.h>
6 #include <robuffer.h>
7 #include <opencv2\imgproc\types_c.h>
8 
9 using namespace Windows::Storage::Streams;
10 using namespace Microsoft::WRL;
11 using namespace Windows::Foundation;
12 using namespace Windows::UI::Core;
13 using namespace Microsoft::WRL;
14 using namespace Windows::Phone::Graphics::Interop;
15 using namespace Windows::Phone::Input::Interop;
16 
17 namespace PhoneXamlDirect3DApp1Comp
18 {
ApplyGrayFilter(const cv::Mat & image)19     void Direct3DInterop::ApplyGrayFilter(const cv::Mat& image)
20     {
21         cv::Mat intermediateMat;
22         cv::cvtColor(image, intermediateMat, CV_RGBA2GRAY);
23         cv::cvtColor(intermediateMat, image, CV_GRAY2BGRA);
24     }
25 
ApplyCannyFilter(const cv::Mat & image)26     void Direct3DInterop::ApplyCannyFilter(const cv::Mat& image)
27     {
28         cv::Mat intermediateMat;
29         cv::Canny(image, intermediateMat, 80, 90);
30         cv::cvtColor(intermediateMat, image, CV_GRAY2BGRA);
31     }
32 
ApplySepiaFilter(const cv::Mat & image)33     void Direct3DInterop::ApplySepiaFilter(const cv::Mat& image)
34     {
35         const float SepiaKernelData[16] =
36         {
37             /* B */0.131f, 0.534f, 0.272f, 0.f,
38             /* G */0.168f, 0.686f, 0.349f, 0.f,
39             /* R */0.189f, 0.769f, 0.393f, 0.f,
40             /* A */0.000f, 0.000f, 0.000f, 1.f
41         };
42 
43         const cv::Mat SepiaKernel(4, 4, CV_32FC1, (void*)SepiaKernelData);
44         cv::transform(image, image, SepiaKernel);
45     }
46 
Direct3DInterop()47     Direct3DInterop::Direct3DInterop() :
48         m_timer(ref new BasicTimer())
49     {
50     }
51 
52     IDrawingSurfaceContentProvider^ Direct3DInterop::CreateContentProvider()
53     {
54         ComPtr<Direct3DContentProvider> provider = Make<Direct3DContentProvider>(this);
55         return reinterpret_cast<IDrawingSurfaceContentProvider^>(provider.Detach());
56     }
57 
58     // IDrawingSurfaceManipulationHandler
59     void Direct3DInterop::SetManipulationHost(DrawingSurfaceManipulationHost^ manipulationHost)
60     {
61         manipulationHost->PointerPressed +=
62             ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DInterop::OnPointerPressed);
63 
64         manipulationHost->PointerMoved +=
65             ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DInterop::OnPointerMoved);
66 
67         manipulationHost->PointerReleased +=
68             ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DInterop::OnPointerReleased);
69     }
70 
set(Windows::Foundation::Size renderResolution)71     void Direct3DInterop::RenderResolution::set(Windows::Foundation::Size renderResolution)
72     {
73         if (renderResolution.Width  != m_renderResolution.Width ||
74             renderResolution.Height != m_renderResolution.Height)
75         {
76             m_renderResolution = renderResolution;
77 
78             if (m_renderer)
79             {
80                 m_renderer->UpdateForRenderResolutionChange(m_renderResolution.Width, m_renderResolution.Height);
81                 RecreateSynchronizedTexture();
82             }
83         }
84     }
85 
86     // Event Handlers
87 
88     void Direct3DInterop::OnPointerPressed(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
89     {
90         // Insert your code here.
91     }
92 
93     void Direct3DInterop::OnPointerMoved(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
94     {
95         // Insert your code here.
96     }
97 
98     void Direct3DInterop::OnPointerReleased(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
99     {
100         // Insert your code here.
101     }
102 
103     // Interface With Direct3DContentProvider
Connect(_In_ IDrawingSurfaceRuntimeHostNative * host)104     HRESULT Direct3DInterop::Connect(_In_ IDrawingSurfaceRuntimeHostNative* host)
105     {
106         m_renderer = ref new CubeRenderer();
107         m_renderer->Initialize();
108         m_renderer->UpdateForWindowSizeChange(WindowBounds.Width, WindowBounds.Height);
109         m_renderer->UpdateForRenderResolutionChange(m_renderResolution.Width, m_renderResolution.Height);
110 
111         // Restart timer after renderer has finished initializing.
112         m_timer->Reset();
113 
114         return S_OK;
115     }
116 
Disconnect()117     void Direct3DInterop::Disconnect()
118     {
119         m_renderer = nullptr;
120     }
121 
PrepareResources(_In_ const LARGE_INTEGER * presentTargetTime,_Out_ BOOL * contentDirty)122     HRESULT Direct3DInterop::PrepareResources(_In_ const LARGE_INTEGER* presentTargetTime, _Out_ BOOL* contentDirty)
123     {
124         *contentDirty = true;
125 
126         return S_OK;
127     }
128 
GetTexture(_In_ const DrawingSurfaceSizeF * size,_Out_ IDrawingSurfaceSynchronizedTextureNative ** synchronizedTexture,_Out_ DrawingSurfaceRectF * textureSubRectangle)129     HRESULT Direct3DInterop::GetTexture(_In_ const DrawingSurfaceSizeF* size, _Out_ IDrawingSurfaceSynchronizedTextureNative** synchronizedTexture, _Out_ DrawingSurfaceRectF* textureSubRectangle)
130     {
131         m_timer->Update();
132         m_renderer->Update(m_timer->Total, m_timer->Delta);
133         m_renderer->Render();
134 
135         RequestAdditionalFrame();
136 
137         return S_OK;
138     }
139 
GetTexture()140     ID3D11Texture2D* Direct3DInterop::GetTexture()
141     {
142         return m_renderer->GetTexture();
143     }
144 
145     void Direct3DInterop::CreateTexture(const Platform::Array<int>^  buffer,int width,int height, OCVFilterType filter)
146     {
147         if (m_renderer)
148         {
149             cv::Mat Lena = cv::Mat(height, width, CV_8UC4);
150             memcpy(Lena.data, buffer->Data, 4 * height*width);
151 
152             switch (filter)
153             {
154                 case OCVFilterType::ePreview:
155                     break;
156 
157                 case OCVFilterType::eGray:
158                     ApplyGrayFilter(Lena);
159                     break;
160 
161                 case OCVFilterType::eCanny:
162                     ApplyCannyFilter(Lena);
163                     break;
164 
165                 case OCVFilterType::eSepia:
166                     ApplySepiaFilter(Lena);
167                     break;
168             }
169 
170             m_renderer->CreateTextureFromByte(Lena.data, width, height);
171         }
172     }
173 
174     byte* GetPointerToPixelData( Windows::Storage::Streams::IBuffer ^ pixelBuffer)
175     {
176         // Query the IBufferByteAccess interface.
177         ComPtr<IBufferByteAccess> bufferByteAccess;
178         reinterpret_cast<IInspectable*>( pixelBuffer)->QueryInterface(IID_PPV_ARGS(&bufferByteAccess));
179 
180         // Retrieve the buffer data.
181         byte* pixels = nullptr;
182         bufferByteAccess->Buffer(&pixels);
183         return pixels;
184     }
185 
186 }
187