123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- #include "pch.h"
- #include "Direct3DInterop.h"
- #include "Direct3DContentProvider.h"
- #include <windows.storage.streams.h>
- #include <wrl.h>
- #include <robuffer.h>
- #include <opencv2\imgproc\types_c.h>
- using namespace Windows::Storage::Streams;
- using namespace Microsoft::WRL;
- using namespace Windows::Foundation;
- using namespace Windows::UI::Core;
- using namespace Microsoft::WRL;
- using namespace Windows::Phone::Graphics::Interop;
- using namespace Windows::Phone::Input::Interop;
- namespace PhoneXamlDirect3DApp1Comp
- {
- void Direct3DInterop::ApplyGrayFilter(const cv::Mat& image)
- {
- cv::Mat intermediateMat;
- cv::cvtColor(image, intermediateMat, COLOR_RGBA2GRAY);
- cv::cvtColor(intermediateMat, image, COLOR_GRAY2BGRA);
- }
- void Direct3DInterop::ApplyCannyFilter(const cv::Mat& image)
- {
- cv::Mat intermediateMat;
- cv::Canny(image, intermediateMat, 80, 90);
- cv::cvtColor(intermediateMat, image, COLOR_GRAY2BGRA);
- }
- void Direct3DInterop::ApplySepiaFilter(const cv::Mat& image)
- {
- const float SepiaKernelData[16] =
- {
- /* B */0.131f, 0.534f, 0.272f, 0.f,
- /* G */0.168f, 0.686f, 0.349f, 0.f,
- /* R */0.189f, 0.769f, 0.393f, 0.f,
- /* A */0.000f, 0.000f, 0.000f, 1.f
- };
- const cv::Mat SepiaKernel(4, 4, CV_32FC1, (void*)SepiaKernelData);
- cv::transform(image, image, SepiaKernel);
- }
- Direct3DInterop::Direct3DInterop() :
- m_timer(ref new BasicTimer())
- {
- }
- IDrawingSurfaceContentProvider^ Direct3DInterop::CreateContentProvider()
- {
- ComPtr<Direct3DContentProvider> provider = Make<Direct3DContentProvider>(this);
- return reinterpret_cast<IDrawingSurfaceContentProvider^>(provider.Detach());
- }
- // IDrawingSurfaceManipulationHandler
- void Direct3DInterop::SetManipulationHost(DrawingSurfaceManipulationHost^ manipulationHost)
- {
- manipulationHost->PointerPressed +=
- ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DInterop::OnPointerPressed);
- manipulationHost->PointerMoved +=
- ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DInterop::OnPointerMoved);
- manipulationHost->PointerReleased +=
- ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DInterop::OnPointerReleased);
- }
- void Direct3DInterop::RenderResolution::set(Windows::Foundation::Size renderResolution)
- {
- if (renderResolution.Width != m_renderResolution.Width ||
- renderResolution.Height != m_renderResolution.Height)
- {
- m_renderResolution = renderResolution;
- if (m_renderer)
- {
- m_renderer->UpdateForRenderResolutionChange(m_renderResolution.Width, m_renderResolution.Height);
- RecreateSynchronizedTexture();
- }
- }
- }
- // Event Handlers
- void Direct3DInterop::OnPointerPressed(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
- {
- // Insert your code here.
- }
- void Direct3DInterop::OnPointerMoved(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
- {
- // Insert your code here.
- }
- void Direct3DInterop::OnPointerReleased(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
- {
- // Insert your code here.
- }
- // Interface With Direct3DContentProvider
- HRESULT Direct3DInterop::Connect(_In_ IDrawingSurfaceRuntimeHostNative* host)
- {
- m_renderer = ref new CubeRenderer();
- m_renderer->Initialize();
- m_renderer->UpdateForWindowSizeChange(WindowBounds.Width, WindowBounds.Height);
- m_renderer->UpdateForRenderResolutionChange(m_renderResolution.Width, m_renderResolution.Height);
- // Restart timer after renderer has finished initializing.
- m_timer->Reset();
- return S_OK;
- }
- void Direct3DInterop::Disconnect()
- {
- m_renderer = nullptr;
- }
- HRESULT Direct3DInterop::PrepareResources(_In_ const LARGE_INTEGER* presentTargetTime, _Out_ BOOL* contentDirty)
- {
- *contentDirty = true;
- return S_OK;
- }
- HRESULT Direct3DInterop::GetTexture(_In_ const DrawingSurfaceSizeF* size, _Out_ IDrawingSurfaceSynchronizedTextureNative** synchronizedTexture, _Out_ DrawingSurfaceRectF* textureSubRectangle)
- {
- m_timer->Update();
- m_renderer->Update(m_timer->Total, m_timer->Delta);
- m_renderer->Render();
- RequestAdditionalFrame();
- return S_OK;
- }
- ID3D11Texture2D* Direct3DInterop::GetTexture()
- {
- return m_renderer->GetTexture();
- }
- void Direct3DInterop::CreateTexture(const Platform::Array<int>^ buffer,int width,int height, OCVFilterType filter)
- {
- if (m_renderer)
- {
- cv::Mat Lena = cv::Mat(height, width, CV_8UC4);
- memcpy(Lena.data, buffer->Data, 4 * height*width);
- switch (filter)
- {
- case OCVFilterType::ePreview:
- break;
- case OCVFilterType::eGray:
- ApplyGrayFilter(Lena);
- break;
- case OCVFilterType::eCanny:
- ApplyCannyFilter(Lena);
- break;
- case OCVFilterType::eSepia:
- ApplySepiaFilter(Lena);
- break;
- }
- m_renderer->CreateTextureFromByte(Lena.data, width, height);
- }
- }
- byte* GetPointerToPixelData( Windows::Storage::Streams::IBuffer ^ pixelBuffer)
- {
- // Query the IBufferByteAccess interface.
- ComPtr<IBufferByteAccess> bufferByteAccess;
- reinterpret_cast<IInspectable*>( pixelBuffer)->QueryInterface(IID_PPV_ARGS(&bufferByteAccess));
- // Retrieve the buffer data.
- byte* pixels = nullptr;
- bufferByteAccess->Buffer(&pixels);
- return pixels;
- }
- }
|