@@ -62,41 +62,8 @@ void ApplicationHandler::presentImageOnTheScreen(irr::core::smart_refctd_ptr<irr
62
62
63
63
driver->updateDescriptorSets (1u , &write, 0u , nullptr );
64
64
65
- std::string viewType;
66
- auto getCurrentGPUPipeline = [&]()
67
- {
68
- switch (gpuImageView->getCreationParameters ().viewType )
69
- {
70
- case IImageView<IGPUImage>::ET_2D:
71
- {
72
- viewType = " 2D" ;
73
- return currentGpuPipelineFor2D;
74
- }
75
-
76
- case IImageView<IGPUImage>::ET_2D_ARRAY:
77
- {
78
- viewType = " 2D array" ;
79
- return currentGpuPipelineFor2DArrays;
80
- }
81
-
82
- case IImageView<IGPUImage>::ET_CUBE_MAP:
83
- {
84
- viewType = " cube map" ;
85
- return currentGpuPipelineForCubemaps;
86
- }
87
-
88
- default :
89
- {
90
- os::Printer::log (" Not supported image view in the example!" , ELL_ERROR);
91
- return gpuPipeline ();
92
- }
93
- }
94
- };
95
-
96
- auto currentGpuPipeline = getCurrentGPUPipeline ();
97
-
98
65
std::wostringstream characterStream;
99
- characterStream << L" Color Space Test Demo - Irrlicht Engine [" << driver->getName () << " ] - CURRENT IMAGE: " << currentHandledImageFileName.c_str () << " - VIEW TYPE: " << viewType. c_str () << " - EXTENSION: " << currentHandledImageExtension.c_str ();
66
+ characterStream << L" Color Space Test Demo - Irrlicht Engine [" << driver->getName () << " ] - CURRENT IMAGE: " << currentHandledImageFileName.c_str () << " - EXTENSION: " << currentHandledImageExtension.c_str ();
100
67
device->setWindowCaption (characterStream.str ().c_str ());
101
68
102
69
auto startPoint = std::chrono::high_resolution_clock::now ();
@@ -109,8 +76,8 @@ void ApplicationHandler::presentImageOnTheScreen(irr::core::smart_refctd_ptr<irr
109
76
110
77
driver->beginScene (true , true );
111
78
112
- driver->bindGraphicsPipeline (currentGpuPipeline .get ());
113
- driver->bindDescriptorSets (EPBP_GRAPHICS, currentGpuPipeline ->getLayout (), 3u , 1u , &samplerDescriptorSet3.get (), nullptr );
79
+ driver->bindGraphicsPipeline (currentGpuPipelineFor2D .get ());
80
+ driver->bindDescriptorSets (EPBP_GRAPHICS, currentGpuPipelineFor2D ->getLayout (), 3u , 1u , &samplerDescriptorSet3.get (), nullptr );
114
81
driver->drawMeshBuffer (currentGpuMeshBuffer.get ());
115
82
116
83
driver->blitRenderTargets (nullptr , screenShotFrameBuffer, false , false );
@@ -122,9 +89,9 @@ void ApplicationHandler::presentImageOnTheScreen(irr::core::smart_refctd_ptr<irr
122
89
123
90
namespace
124
91
{
125
- template <class Kernel >
126
- class MyKernel : public asset ::CFloatingPointSeparableImageFilterKernelBase<MyKernel<Kernel>>
127
- {
92
+ template <class Kernel >
93
+ class MyKernel : public asset ::CFloatingPointSeparableImageFilterKernelBase<MyKernel<Kernel>>
94
+ {
128
95
using Base = asset::CFloatingPointSeparableImageFilterKernelBase<MyKernel<Kernel>>;
129
96
130
97
Kernel kernel;
@@ -142,11 +109,91 @@ namespace
142
109
{
143
110
return kernel.weight (x, channel) * multiplier;
144
111
}
112
+
113
+ // we need to ensure to override the default behaviour of `CFloatingPointSeparableImageFilterKernelBase` which applies the weight along every axis
114
+ template <class PreFilter , class PostFilter >
115
+ struct sample_functor_t
116
+ {
117
+ sample_functor_t (const MyKernel* _this, PreFilter& _preFilter, PostFilter& _postFilter) :
118
+ _this (_this), preFilter(_preFilter), postFilter(_postFilter) {}
119
+
120
+ inline void operator ()(value_type* windowSample, core::vectorSIMDf& relativePos, const core::vectorSIMDi32& globalTexelCoord, const IImageFilterKernel::UserData* userData)
121
+ {
122
+ preFilter (windowSample, relativePos, globalTexelCoord, userData);
123
+ auto * scale = IImageFilterKernel::ScaleFactorUserData::cast (userData);
124
+ for (int32_t i=0 ; i<MaxChannels; i++)
125
+ {
126
+ // this differs from the `CFloatingPointSeparableImageFilterKernelBase`
127
+ windowSample[i] *= _this->weight (relativePos.x , i);
128
+ if (scale)
129
+ windowSample[i] *= scale->factor [i];
130
+ }
131
+ postFilter (windowSample, relativePos, globalTexelCoord, userData);
132
+ }
133
+
134
+ private:
135
+ const MyKernel* _this;
136
+ PreFilter& preFilter;
137
+ PostFilter& postFilter;
138
+ };
145
139
146
140
_IRR_STATIC_INLINE_CONSTEXPR bool has_derivative = false ;
147
141
148
142
IRR_DECLARE_DEFINE_CIMAGEFILTER_KERNEL_PASS_THROUGHS (Base)
149
- };
143
+ };
144
+
145
+ template <class Kernel >
146
+ class SeparateOutXAxisKernel : public asset ::CFloatingPointSeparableImageFilterKernelBase<SeparateOutXAxisKernel<Kernel>>
147
+ {
148
+ using Base = asset::CFloatingPointSeparableImageFilterKernelBase<SeparateOutXAxisKernel<Kernel>>;
149
+
150
+ Kernel kernel;
151
+
152
+ public:
153
+ // passthrough everything
154
+ using value_type = typename Kernel::value_type;
155
+
156
+ _IRR_STATIC_INLINE_CONSTEXPR auto MaxChannels = Kernel::MaxChannels; // derivative map only needs 2 channels
157
+
158
+ SeparateOutXAxisKernel (Kernel&& k) : Base(k.negative_support.x, k.positive_support.x), kernel(std::move(k)) {}
159
+
160
+ IRR_DECLARE_DEFINE_CIMAGEFILTER_KERNEL_PASS_THROUGHS (Base)
161
+
162
+ // we need to ensure to override the default behaviour of `CFloatingPointSeparableImageFilterKernelBase` which applies the weight along every axis
163
+ template <class PreFilter , class PostFilter >
164
+ struct sample_functor_t
165
+ {
166
+ sample_functor_t (const SeparateOutXAxisKernel<Kernel>* _this, PreFilter& _preFilter, PostFilter& _postFilter) :
167
+ _this (_this), preFilter(_preFilter), postFilter(_postFilter) {}
168
+
169
+ inline void operator ()(value_type* windowSample, core::vectorSIMDf& relativePos, const core::vectorSIMDi32& globalTexelCoord, const IImageFilterKernel::UserData* userData)
170
+ {
171
+ preFilter (windowSample, relativePos, globalTexelCoord, userData);
172
+ auto * scale = IImageFilterKernel::ScaleFactorUserData::cast (userData);
173
+ for (int32_t i=0 ; i<MaxChannels; i++)
174
+ {
175
+ // this differs from the `CFloatingPointSeparableImageFilterKernelBase`
176
+ windowSample[i] *= _this->kernel .weight (relativePos.x , i);
177
+ if (scale)
178
+ windowSample[i] *= scale->factor [i];
179
+ }
180
+ postFilter (windowSample, relativePos, globalTexelCoord, userData);
181
+ }
182
+
183
+ private:
184
+ const SeparateOutXAxisKernel<Kernel>* _this;
185
+ PreFilter& preFilter;
186
+ PostFilter& postFilter;
187
+ };
188
+
189
+ // the method all kernels must define and overload
190
+ template <class PreFilter , class PostFilter >
191
+ inline auto create_sample_functor_t (PreFilter& preFilter, PostFilter& postFilter) const
192
+ {
193
+ return sample_functor_t (this ,preFilter,postFilter);
194
+ }
195
+ };
196
+
150
197
}
151
198
static core::smart_refctd_ptr<asset::ICPUImage> createDerivMapFromHeightMap (asset::ICPUImage* _inImg, asset::ISampler::E_TEXTURE_CLAMP _uwrap, asset::ISampler::E_TEXTURE_CLAMP _vwrap, asset::ISampler::E_TEXTURE_BORDER_COLOR _borderColor)
152
199
{
@@ -181,8 +228,10 @@ static core::smart_refctd_ptr<asset::ICPUImage> createDerivMapFromHeightMap(asse
181
228
using ReconstructionKernel = CGaussianImageFilterKernel<>; // or Mitchell
182
229
using DerivKernel_ = CDerivativeImageFilterKernel<ReconstructionKernel>;
183
230
using DerivKernel = MyKernel<DerivKernel_>;
184
- using XDerivKernel = CChannelIndependentImageFilterKernel<DerivKernel, CBoxImageFilterKernel>;
185
- using YDerivKernel = CChannelIndependentImageFilterKernel<CBoxImageFilterKernel, DerivKernel>;
231
+ using XDerivKernel_ = CChannelIndependentImageFilterKernel<DerivKernel, CBoxImageFilterKernel>;
232
+ using YDerivKernel_ = CChannelIndependentImageFilterKernel<CBoxImageFilterKernel, DerivKernel>;
233
+ using XDerivKernel = SeparateOutXAxisKernel<XDerivKernel_>;
234
+ using YDerivKernel = SeparateOutXAxisKernel<YDerivKernel_>;
186
235
using DerivativeMapFilter = CBlitImageFilter
187
236
<
188
237
false , false , DefaultSwizzle, IdentityDither, // (Criss, look at impl::CSwizzleAndConvertImageFilterBase)
@@ -193,8 +242,8 @@ static core::smart_refctd_ptr<asset::ICPUImage> createDerivMapFromHeightMap(asse
193
242
194
243
const auto extent = _inImg->getCreationParameters ().extent ;
195
244
const float mlt = static_cast <float >(std::max (extent.width , extent.height ));
196
- XDerivKernel xderiv{ DerivKernel (DerivKernel_ (ReconstructionKernel ()), mlt), CBoxImageFilterKernel () } ;
197
- YDerivKernel yderiv{ CBoxImageFilterKernel (), DerivKernel (DerivKernel_ (ReconstructionKernel ()), mlt) } ;
245
+ XDerivKernel xderiv ( XDerivKernel_ ( DerivKernel (DerivKernel_ (ReconstructionKernel ()), mlt), CBoxImageFilterKernel () )) ;
246
+ YDerivKernel yderiv ( YDerivKernel_ ( CBoxImageFilterKernel (), DerivKernel (DerivKernel_ (ReconstructionKernel ()), mlt) )) ;
198
247
199
248
using swizzle_t = asset::ICPUImageView::SComponentMapping;
200
249
DerivativeMapFilter::state_type state (std::move (xderiv), std::move (yderiv), CBoxImageFilterKernel ());
@@ -381,8 +430,6 @@ bool ApplicationHandler::initializeApplication()
381
430
};
382
431
383
432
currentGpuPipelineFor2D = createGPUPipeline (IImageView<ICPUImage>::E_TYPE::ET_2D);
384
- currentGpuPipelineFor2DArrays = createGPUPipeline (IImageView<ICPUImage>::E_TYPE::ET_2D_ARRAY);
385
- currentGpuPipelineForCubemaps = createGPUPipeline (IImageView<ICPUImage>::E_TYPE::ET_CUBE_MAP);
386
433
387
434
{
388
435
SBufferBinding<IGPUBuffer> idxBinding{ 0ull , nullptr };
0 commit comments