1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef SHADERS__COMMON__3D_DM_INPLANE_SAMPLING_COMMON_H
17 #define SHADERS__COMMON__3D_DM_INPLANE_SAMPLING_COMMON_H
18 
19 /*
20  * Needs to be included after the descriptor sets are bound.
21  */
22 
GetTransformedUV(const DefaultMaterialUnpackedTexTransformStruct texTransform,const vec2 uvInput)23 vec2 GetTransformedUV(const DefaultMaterialUnpackedTexTransformStruct texTransform, const vec2 uvInput)
24 {
25     vec2 uv;
26     uv.x = dot(texTransform.rotateScale.xy, uvInput);
27     uv.y = dot(texTransform.rotateScale.zw, uvInput);
28     uv += texTransform.translate.xy;
29     return uv;
30 }
31 
32 // transform = high bits (16)
33 // uv set bit = low bits (0)
GetUnpackTexCoordInfo()34 uint GetUnpackTexCoordInfo()
35 {
36     return floatBitsToUint(uMaterialData.material[0].factors[CORE_MATERIAL_FACTOR_ADDITIONAL_IDX].y);
37 }
GetUnpackTexCoordInfo(uint instanceIdx)38 uint GetUnpackTexCoordInfo(uint instanceIdx)
39 {
40     return floatBitsToUint(uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_ADDITIONAL_IDX].y);
41 }
42 
GetFinalSamplingUV(vec4 inputUv,uint texCoordInfoBit,uint texCoordIdx)43 vec2 GetFinalSamplingUV(vec4 inputUv, uint texCoordInfoBit, uint texCoordIdx)
44 {
45     const uint texCoordInfo = GetUnpackTexCoordInfo();
46     vec2 uv = (((texCoordInfo >> CORE_MATERIAL_TEXCOORD_INFO_SHIFT) & texCoordInfoBit) == texCoordInfoBit) ? inputUv.zw
47                                                                                                            : inputUv.xy;
48     const bool doTrans = (((texCoordInfo & 0xffff) & texCoordInfoBit) == texCoordInfoBit);
49     if (((CORE_MATERIAL_FLAGS & CORE_MATERIAL_TEXTURE_TRANSFORM_BIT) == CORE_MATERIAL_TEXTURE_TRANSFORM_BIT) &&
50         doTrans) {
51         DefaultMaterialUnpackedTexTransformStruct texTransform =
52             GetUnpackTextureTransform(uMaterialTransformData.material[0].packed[texCoordIdx]);
53         uv = GetTransformedUV(texTransform, uv);
54     }
55     return uv;
56 }
GetFinalSamplingUV(vec4 inputUv,uint texCoordInfoBit,uint texCoordIdx,uint instanceIdx)57 vec2 GetFinalSamplingUV(vec4 inputUv, uint texCoordInfoBit, uint texCoordIdx, uint instanceIdx)
58 {
59     const uint texCoordInfo = GetUnpackTexCoordInfo(instanceIdx);
60     vec2 uv = (((texCoordInfo >> CORE_MATERIAL_TEXCOORD_INFO_SHIFT) & texCoordInfoBit) == texCoordInfoBit) ? inputUv.zw
61                                                                                                            : inputUv.xy;
62     const bool doTrans = (((texCoordInfo & 0xffff) & texCoordInfoBit) == texCoordInfoBit);
63     if (((CORE_MATERIAL_FLAGS & CORE_MATERIAL_TEXTURE_TRANSFORM_BIT) == CORE_MATERIAL_TEXTURE_TRANSFORM_BIT) &&
64         doTrans) {
65         DefaultMaterialUnpackedTexTransformStruct texTransform =
66             GetUnpackTextureTransform(uMaterialTransformData.material[instanceIdx].packed[texCoordIdx]);
67         uv = GetTransformedUV(texTransform, uv);
68     }
69     return uv;
70 }
71 
GetBaseColorSample(const vec4 uvInput)72 vec4 GetBaseColorSample(const vec4 uvInput)
73 {
74     const vec2 uv =
75         GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_BASE_BIT, CORE_MATERIAL_PACK_TEX_BASE_COLOR_UV_IDX);
76     return texture(uSampTextureBase, uv);
77 }
GetBaseColorSample(const vec4 uvInput,const uint instanceIdx)78 vec4 GetBaseColorSample(const vec4 uvInput, const uint instanceIdx)
79 {
80     const vec2 uv = GetFinalSamplingUV(
81         uvInput, CORE_MATERIAL_TEXCOORD_INFO_BASE_BIT, CORE_MATERIAL_PACK_TEX_BASE_COLOR_UV_IDX, instanceIdx);
82     return texture(uSampTextureBase, uv);
83 }
84 
GetNormalSample(const vec4 uvInput)85 vec3 GetNormalSample(const vec4 uvInput)
86 {
87     const vec2 uv =
88         GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_NORMAL_BIT, CORE_MATERIAL_PACK_TEX_NORMAL_UV_IDX);
89     return texture(uSampTextures[CORE_MATERIAL_TEX_NORMAL_IDX], uv).xyz;
90 }
GetNormalSample(const vec4 uvInput,const uint instanceIdx)91 vec3 GetNormalSample(const vec4 uvInput, const uint instanceIdx)
92 {
93     const vec2 uv = GetFinalSamplingUV(
94         uvInput, CORE_MATERIAL_TEXCOORD_INFO_NORMAL_BIT, CORE_MATERIAL_PACK_TEX_NORMAL_UV_IDX, instanceIdx);
95     return texture(uSampTextures[CORE_MATERIAL_TEX_NORMAL_IDX], uv).xyz;
96 }
97 
GetMaterialSample(const vec4 uvInput)98 vec4 GetMaterialSample(const vec4 uvInput)
99 {
100     const vec2 uv =
101         GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_MATERIAL_BIT, CORE_MATERIAL_PACK_TEX_MATERIAL_UV_IDX);
102     return texture(uSampTextures[CORE_MATERIAL_TEX_MATERIAL_IDX], uv);
103 }
GetMaterialSample(const vec4 uvInput,const uint instanceIdx)104 vec4 GetMaterialSample(const vec4 uvInput, const uint instanceIdx)
105 {
106     const vec2 uv = GetFinalSamplingUV(
107         uvInput, CORE_MATERIAL_TEXCOORD_INFO_MATERIAL_BIT, CORE_MATERIAL_PACK_TEX_MATERIAL_UV_IDX, instanceIdx);
108     return texture(uSampTextures[CORE_MATERIAL_TEX_MATERIAL_IDX], uv);
109 }
110 
GetEmissiveSample(const vec4 uvInput)111 vec3 GetEmissiveSample(const vec4 uvInput)
112 {
113     const vec2 uv =
114         GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_EMISSIVE_BIT, CORE_MATERIAL_PACK_TEX_EMISSIVE_UV_IDX);
115     return texture(uSampTextures[CORE_MATERIAL_TEX_EMISSIVE_IDX], uv).xyz;
116 }
GetEmissiveSample(const vec4 uvInput,const uint instanceIdx)117 vec3 GetEmissiveSample(const vec4 uvInput, const uint instanceIdx)
118 {
119     const vec2 uv = GetFinalSamplingUV(
120         uvInput, CORE_MATERIAL_TEXCOORD_INFO_EMISSIVE_BIT, CORE_MATERIAL_PACK_TEX_EMISSIVE_UV_IDX, instanceIdx);
121     return texture(uSampTextures[CORE_MATERIAL_TEX_EMISSIVE_IDX], uv).xyz;
122 }
123 
GetAOSample(const vec4 uvInput)124 float GetAOSample(const vec4 uvInput)
125 {
126     const vec2 uv = GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_AO_BIT, CORE_MATERIAL_PACK_TEX_AO_UV_IDX);
127     return texture(uSampTextures[CORE_MATERIAL_TEX_AO_IDX], uv).x;
128 }
GetAOSample(const vec4 uvInput,const uint instanceIdx)129 float GetAOSample(const vec4 uvInput, const uint instanceIdx)
130 {
131     const vec2 uv =
132         GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_AO_BIT, CORE_MATERIAL_PACK_TEX_AO_UV_IDX, instanceIdx);
133     return texture(uSampTextures[CORE_MATERIAL_TEX_AO_IDX], uv).x;
134 }
135 
GetClearcoatSample(const vec4 uvInput)136 float GetClearcoatSample(const vec4 uvInput)
137 {
138     const vec2 uv =
139         GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_CLEARCOAT_BIT, CORE_MATERIAL_PACK_TEX_CLEARCOAT_UV_IDX);
140     return texture(uSampTextures[CORE_MATERIAL_TEX_CLEARCOAT_IDX], uv).x;
141 }
GetClearcoatSample(const vec4 uvInput,const uint instanceIdx)142 float GetClearcoatSample(const vec4 uvInput, const uint instanceIdx)
143 {
144     const vec2 uv = GetFinalSamplingUV(
145         uvInput, CORE_MATERIAL_TEXCOORD_INFO_CLEARCOAT_BIT, CORE_MATERIAL_PACK_TEX_CLEARCOAT_UV_IDX, instanceIdx);
146     return texture(uSampTextures[CORE_MATERIAL_TEX_CLEARCOAT_IDX], uv).x;
147 }
148 
GetClearcoatRoughnessSample(const vec4 uvInput)149 float GetClearcoatRoughnessSample(const vec4 uvInput)
150 {
151     const vec2 uv = GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_CLEARCOAT_ROUGHNESS_BIT,
152         CORE_MATERIAL_PACK_TEX_CLEARCOAT_ROUGHNESS_UV_IDX);
153     return texture(uSampTextures[CORE_MATERIAL_TEX_CLEARCOAT_ROUGHNESS_IDX], uv).y;
154 }
GetClearcoatRoughnessSample(const vec4 uvInput,const uint instanceIdx)155 float GetClearcoatRoughnessSample(const vec4 uvInput, const uint instanceIdx)
156 {
157     const vec2 uv = GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_CLEARCOAT_ROUGHNESS_BIT,
158         CORE_MATERIAL_PACK_TEX_CLEARCOAT_ROUGHNESS_UV_IDX, instanceIdx);
159     return texture(uSampTextures[CORE_MATERIAL_TEX_CLEARCOAT_ROUGHNESS_IDX], uv).y;
160 }
161 
GetClearcoatNormalSample(const vec4 uvInput)162 vec3 GetClearcoatNormalSample(const vec4 uvInput)
163 {
164     const vec2 uv = GetFinalSamplingUV(
165         uvInput, CORE_MATERIAL_TEXCOORD_INFO_CLEARCOAT_NORMAL_BIT, CORE_MATERIAL_PACK_TEX_CLEARCOAT_NORMAL_UV_IDX);
166     return texture(uSampTextures[CORE_MATERIAL_TEX_CLEARCOAT_NORMAL_IDX], uv).xyz;
167 }
GetClearcoatNormalSample(const vec4 uvInput,const uint instanceIdx)168 vec3 GetClearcoatNormalSample(const vec4 uvInput, const uint instanceIdx)
169 {
170     const vec2 uv = GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_CLEARCOAT_NORMAL_BIT,
171         CORE_MATERIAL_PACK_TEX_CLEARCOAT_NORMAL_UV_IDX, instanceIdx);
172     return texture(uSampTextures[CORE_MATERIAL_TEX_CLEARCOAT_NORMAL_IDX], uv).xyz;
173 }
174 
GetSheenSample(const vec4 uvInput)175 vec3 GetSheenSample(const vec4 uvInput)
176 {
177     const vec2 uv =
178         GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_SHEEN_BIT, CORE_MATERIAL_PACK_TEX_SHEEN_UV_IDX);
179     return texture(uSampTextures[CORE_MATERIAL_TEX_SHEEN_IDX], uv).xyz;
180 }
GetSheenSample(const vec4 uvInput,const uint instanceIdx)181 vec3 GetSheenSample(const vec4 uvInput, const uint instanceIdx)
182 {
183     const vec2 uv = GetFinalSamplingUV(
184         uvInput, CORE_MATERIAL_TEXCOORD_INFO_SHEEN_BIT, CORE_MATERIAL_PACK_TEX_SHEEN_UV_IDX, instanceIdx);
185     return texture(uSampTextures[CORE_MATERIAL_TEX_SHEEN_IDX], uv).xyz;
186 }
187 
188 // NOTE: from sheen alpha
GetSheenRoughnessSample(const vec4 uvInput)189 float GetSheenRoughnessSample(const vec4 uvInput)
190 {
191     const vec2 uv =
192         GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_SHEEN_BIT, CORE_MATERIAL_PACK_TEX_SHEEN_UV_IDX);
193     return texture(uSampTextures[CORE_MATERIAL_TEX_SHEEN_IDX], uv).a; // alpha
194 }
GetSheenRoughnessSample(const vec4 uvInput,const uint instanceIdx)195 float GetSheenRoughnessSample(const vec4 uvInput, const uint instanceIdx)
196 {
197     const vec2 uv = GetFinalSamplingUV(
198         uvInput, CORE_MATERIAL_TEXCOORD_INFO_SHEEN_BIT, CORE_MATERIAL_PACK_TEX_SHEEN_UV_IDX, instanceIdx);
199     return texture(uSampTextures[CORE_MATERIAL_TEX_SHEEN_IDX], uv).a; // alpha
200 }
201 
GetTransmissionSample(const vec4 uvInput)202 float GetTransmissionSample(const vec4 uvInput)
203 {
204     const vec2 uv = GetFinalSamplingUV(
205         uvInput, CORE_MATERIAL_TEXCOORD_INFO_TRANSMISSION_BIT, CORE_MATERIAL_PACK_TEX_TRANSMISSION_UV_IDX);
206     return texture(uSampTextures[CORE_MATERIAL_TEX_TRANSMISSION_IDX], uv).r;
207 }
GetTransmissionSample(const vec4 uvInput,const uint instanceIdx)208 float GetTransmissionSample(const vec4 uvInput, const uint instanceIdx)
209 {
210     const vec2 uv = GetFinalSamplingUV(
211         uvInput, CORE_MATERIAL_TEXCOORD_INFO_TRANSMISSION_BIT, CORE_MATERIAL_PACK_TEX_TRANSMISSION_UV_IDX, instanceIdx);
212     return texture(uSampTextures[CORE_MATERIAL_TEX_TRANSMISSION_IDX], uv).r;
213 }
214 
GetSpecularSample(const vec4 uvInput)215 vec4 GetSpecularSample(const vec4 uvInput)
216 {
217     const vec2 uv =
218         GetFinalSamplingUV(uvInput, CORE_MATERIAL_TEXCOORD_INFO_SPECULAR_BIT, CORE_MATERIAL_PACK_TEX_SPECULAR_UV_IDX);
219     return texture(uSampTextures[CORE_MATERIAL_TEX_SPECULAR_IDX], uv);
220 }
GetSpecularSample(const vec4 uvInput,const uint instanceIdx)221 vec4 GetSpecularSample(const vec4 uvInput, const uint instanceIdx)
222 {
223     const vec2 uv = GetFinalSamplingUV(
224         uvInput, CORE_MATERIAL_TEXCOORD_INFO_SPECULAR_BIT, CORE_MATERIAL_PACK_TEX_SPECULAR_UV_IDX, instanceIdx);
225     return texture(uSampTextures[CORE_MATERIAL_TEX_SPECULAR_IDX], uv);
226 }
227 
228 /*
229  * Inplace sampling of material data, similar functions with ubo input in 3d_dm_structures_common.h
230  */
231 
GetUnpackCameraIndex()232 uint GetUnpackCameraIndex()
233 {
234     return uGeneralData.indices.x;
235 }
236 
GetUnpackViewport()237 vec4 GetUnpackViewport()
238 {
239     return uGeneralData.viewportSizeInvViewportSize;
240 }
241 
GetUnpackBaseColor(const uint instanceIdx)242 vec4 GetUnpackBaseColor(const uint instanceIdx)
243 {
244     return uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_BASE_IDX];
245 }
246 
GetUnpackMaterial(const uint instanceIdx)247 vec4 GetUnpackMaterial(const uint instanceIdx)
248 {
249     return uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_MATERIAL_IDX];
250 }
251 
GetUnpackAO(const uint instanceIdx)252 float GetUnpackAO(const uint instanceIdx)
253 {
254     return uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_AO_IDX].x;
255 }
256 
GetUnpackClearcoat(const uint instanceIdx)257 float GetUnpackClearcoat(const uint instanceIdx)
258 {
259     return uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_CLEARCOAT_IDX].x;
260 }
261 
262 // NOTE: sampling from .y
GetUnpackClearcoatRoughness(const uint instanceIdx)263 float GetUnpackClearcoatRoughness(const uint instanceIdx)
264 {
265     return uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_CLEARCOAT_ROUGHNESS_IDX].y;
266 }
267 
GetUnpackClearcoatNormalScale(const uint instanceIdx)268 float GetUnpackClearcoatNormalScale(const uint instanceIdx)
269 {
270     return uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_CLEARCOAT_NORMAL_IDX].x;
271 }
272 
273 // .xyz = sheen factor, .w = sheen roughness
GetUnpackSheen(const uint instanceIdx)274 vec4 GetUnpackSheen(const uint instanceIdx)
275 {
276     return uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_SHEEN_IDX];
277 }
278 
GetUnpackTransmission(const uint instanceIdx)279 float GetUnpackTransmission(const uint instanceIdx)
280 {
281     return uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_TRANSMISSION_IDX].x;
282 }
283 
284 // .xyz = specular color, .w = specular strength
GetUnpackSpecular(const uint instanceIdx)285 vec4 GetUnpackSpecular(const uint instanceIdx)
286 {
287     return uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_SPECULAR_IDX];
288 }
289 
GetUnpackEmissiveColor(const uint instanceIdx)290 vec3 GetUnpackEmissiveColor(const uint instanceIdx)
291 {
292     const vec4 emissive = uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_EMISSIVE_IDX];
293     return emissive.rgb * emissive.a;
294 }
295 
GetUnpackNormalScale(const uint instanceIdx)296 float GetUnpackNormalScale(const uint instanceIdx)
297 {
298     return uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_NORMAL_IDX].x;
299 }
300 
GetUnpackAlphaCutoff(const uint instanceIdx)301 float GetUnpackAlphaCutoff(const uint instanceIdx)
302 {
303     return uMaterialData.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_ADDITIONAL_IDX].x;
304 }
305 
GetUnpackMaterialTextureInfoSlotFactor(const uint materialIndexSlot,const uint instanceIdx)306 vec4 GetUnpackMaterialTextureInfoSlotFactor(const uint materialIndexSlot, const uint instanceIdx)
307 {
308     const uint maxIndex = min(materialIndexSlot, CORE_MATERIAL_FACTOR_UNIFORM_VEC4_COUNT - 1);
309     return uMaterialData.material[instanceIdx].factors[maxIndex].xyzw;
310 }
311 
Unpremultiply(in vec4 color)312 vec4 Unpremultiply(in vec4 color)
313 {
314     if (color.a == 0.0) {
315         return vec4(0);
316     }
317     return vec4(color.rgb / color.a, color.a);
318 }
319 
GetUnpackBaseColorFinalValue(in CORE_RELAXEDP vec4 color,in vec4 uv,in uint instanceIdx)320 CORE_RELAXEDP vec4 GetUnpackBaseColorFinalValue(in CORE_RELAXEDP vec4 color, in vec4 uv, in uint instanceIdx)
321 {
322     // NOTE: by the spec with blend mode opaque alpha should be 1.0 from this calculation
323     CORE_RELAXEDP vec4 baseColor = GetBaseColorSample(uv, instanceIdx) * GetUnpackBaseColor(instanceIdx) * color;
324     baseColor.a = clamp(baseColor.a, 0.0, 1.0);
325     if ((CORE_MATERIAL_FLAGS & CORE_MATERIAL_ADDITIONAL_SHADER_DISCARD_BIT) ==
326         CORE_MATERIAL_ADDITIONAL_SHADER_DISCARD_BIT) {
327         if (baseColor.a < GetUnpackAlphaCutoff(instanceIdx)) {
328             discard;
329         }
330     }
331     if ((CORE_MATERIAL_FLAGS & CORE_MATERIAL_OPAQUE_BIT) == CORE_MATERIAL_OPAQUE_BIT) {
332         baseColor.a = 1.0;
333     } else {
334         baseColor = Unpremultiply(baseColor);
335     }
336     return baseColor;
337 }
338 
339 // DEPRECATED: use the one with cameraIdx
GetFinalCalculatedVelocity(in vec3 pos,in vec3 prevPos)340 vec2 GetFinalCalculatedVelocity(in vec3 pos, in vec3 prevPos)
341 {
342     // NOTE: velocity should be unjittered when reading (or calc without jitter)
343     // currently default cameras calculates the same jitter for both frames
344 
345     const uint cameraIdx = GetUnpackCameraIndex();
346     const vec4 projPos = uCameras[cameraIdx].viewProj * vec4(pos.xyz, 1.0);
347     const vec4 projPosPrev = uCameras[cameraIdx].viewProjPrevFrame * vec4(prevPos.xyz, 1.0);
348 
349     const vec2 uvPos = (projPos.xy / projPos.w) * 0.5 + 0.5;
350     const vec2 oldUvPos = (projPosPrev.xy / projPosPrev.w) * 0.5 + 0.5;
351     // better precision for fp16 and expected in parts of engine
352     return (uvPos - oldUvPos) * uGeneralData.viewportSizeInvViewportSize.xy;
353 }
354 
GetFinalCalculatedVelocity(in vec3 pos,in vec3 prevPos,in uint cameraIdx)355 vec2 GetFinalCalculatedVelocity(in vec3 pos, in vec3 prevPos, in uint cameraIdx)
356 {
357     // NOTE: velocity should be unjittered when reading (or calc without jitter)
358     // currently default cameras calculates the same jitter for both frames
359 
360     const vec4 projPos = uCameras[cameraIdx].viewProj * vec4(pos.xyz, 1.0);
361     const vec4 projPosPrev = uCameras[cameraIdx].viewProjPrevFrame * vec4(prevPos.xyz, 1.0);
362 
363     const vec2 uvPos = (projPos.xy / projPos.w) * 0.5 + 0.5;
364     const vec2 oldUvPos = (projPosPrev.xy / projPosPrev.w) * 0.5 + 0.5;
365     // better precision for fp16 and expected in parts of engine
366     return (uvPos - oldUvPos) * uGeneralData.viewportSizeInvViewportSize.xy;
367 }
368 #endif // SHADERS__COMMON__3D_DM_INPLANE_SAMPLING_COMMON_H
369