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_DEFAULT_MATERIAL_STRUCTURES_COMMON_H
17 #define SHADERS__COMMON__3D_DEFAULT_MATERIAL_STRUCTURES_COMMON_H
18 
19 #include "render/shaders/common/render_compatibility_common.h"
20 #include "render/shaders/common/render_packing_common.h"
21 
22 #ifdef VULKAN
23 
24 // aligned to 256 with indcies uvec4
25 #define CORE_MATERIAL_FACTOR_UNIFORM_VEC4_COUNT 15
26 #define CORE_MATERIAL_PACKED_UNIFORM_UVEC4_COUNT 15
27 
28 #define CORE_MATERIAL_DEFAULT_REFLECTANCE 0.04
29 
30 #define CORE3D_HDR_FLOAT_CLAMP_MAX_VALUE 64512.0
31 
32 // base color is separated
33 #define CORE_MATERIAL_TEX_NORMAL_IDX 0
34 #define CORE_MATERIAL_TEX_MATERIAL_IDX 1
35 #define CORE_MATERIAL_TEX_EMISSIVE_IDX 2
36 #define CORE_MATERIAL_TEX_AO_IDX 3
37 #define CORE_MATERIAL_TEX_CLEARCOAT_IDX 4
38 #define CORE_MATERIAL_TEX_CLEARCOAT_ROUGHNESS_IDX 5
39 #define CORE_MATERIAL_TEX_CLEARCOAT_NORMAL_IDX 6
40 #define CORE_MATERIAL_TEX_SHEEN_IDX 7
41 #define CORE_MATERIAL_TEX_TRANSMISSION_IDX 8
42 #define CORE_MATERIAL_TEX_SPECULAR_IDX 9
43 #define CORE_MATERIAL_SAMPTEX_COUNT 10
44 
45 #define CORE_MATERIAL_TEXCOORD_INFO_SHIFT 16
46 
47 #define CORE_MATERIAL_TEXCOORD_INFO_BASE_BIT (1 << 0)
48 #define CORE_MATERIAL_TEXCOORD_INFO_NORMAL_BIT (1 << 1)
49 #define CORE_MATERIAL_TEXCOORD_INFO_MATERIAL_BIT (1 << 2)
50 #define CORE_MATERIAL_TEXCOORD_INFO_EMISSIVE_BIT (1 << 3)
51 #define CORE_MATERIAL_TEXCOORD_INFO_AO_BIT (1 << 4)
52 #define CORE_MATERIAL_TEXCOORD_INFO_CLEARCOAT_BIT (1 << 5)
53 #define CORE_MATERIAL_TEXCOORD_INFO_CLEARCOAT_ROUGHNESS_BIT (1 << 6)
54 #define CORE_MATERIAL_TEXCOORD_INFO_CLEARCOAT_NORMAL_BIT (1 << 7)
55 #define CORE_MATERIAL_TEXCOORD_INFO_SHEEN_BIT (1 << 8)
56 #define CORE_MATERIAL_TEXCOORD_INFO_TRANSMISSION_BIT (1 << 9)
57 #define CORE_MATERIAL_TEXCOORD_INFO_SPECULAR_BIT (1 << 10)
58 
59 // factor indices
60 #define CORE_MATERIAL_FACTOR_BASE_IDX 0
61 #define CORE_MATERIAL_FACTOR_NORMAL_IDX 1
62 #define CORE_MATERIAL_FACTOR_MATERIAL_IDX 2
63 #define CORE_MATERIAL_FACTOR_EMISSIVE_IDX 3
64 #define CORE_MATERIAL_FACTOR_AO_IDX 4
65 #define CORE_MATERIAL_FACTOR_CLEARCOAT_IDX 5
66 #define CORE_MATERIAL_FACTOR_CLEARCOAT_ROUGHNESS_IDX 6
67 #define CORE_MATERIAL_FACTOR_CLEARCOAT_NORMAL_IDX 7
68 #define CORE_MATERIAL_FACTOR_SHEEN_IDX 8
69 #define CORE_MATERIAL_FACTOR_TRANSMISSION_IDX 9
70 #define CORE_MATERIAL_FACTOR_SPECULAR_IDX 10
71 #define CORE_MATERIAL_FACTOR_ADDITIONAL_IDX 11
72 
73 // packed texture transforms
74 #define CORE_MATERIAL_PACK_TEX_BASE_COLOR_UV_IDX 0
75 #define CORE_MATERIAL_PACK_TEX_NORMAL_UV_IDX 1
76 #define CORE_MATERIAL_PACK_TEX_MATERIAL_UV_IDX 2
77 #define CORE_MATERIAL_PACK_TEX_EMISSIVE_UV_IDX 3
78 #define CORE_MATERIAL_PACK_TEX_AO_UV_IDX 4
79 #define CORE_MATERIAL_PACK_TEX_CLEARCOAT_UV_IDX 5
80 #define CORE_MATERIAL_PACK_TEX_CLEARCOAT_ROUGHNESS_UV_IDX 6
81 #define CORE_MATERIAL_PACK_TEX_CLEARCOAT_NORMAL_UV_IDX 7
82 #define CORE_MATERIAL_PACK_TEX_SHEEN_UV_IDX 8
83 #define CORE_MATERIAL_PACK_TEX_TRANSMISSION_UV_IDX 9
84 #define CORE_MATERIAL_PACK_TEX_SPECULAR_UV_IDX 10
85 #define CORE_MATERIAL_PACK_ADDITIONAL_IDX 11
86 
87 // needs to match api/core/material/material_desc.h MaterialAlphaMode
88 #define CORE_MATERIAL_METALLIC_ROUGHNESS 0
89 #define CORE_MATERIAL_SPECULAR_GLOSSINESS 1
90 #define CORE_MATERIAL_UNLIT 2
91 #define CORE_MATERIAL_UNLIT_SHADOW_ALPHA 3
92 #define CORE_MATERIAL_CUSTOM 4
93 #define CORE_MATERIAL_CUSTOM_COMPLEX 5
94 
95 // needs to match LumeEngine/3D/api/3d/render/render_data_defines_3d.h RenderMaterialFlagBits
96 #define CORE_MATERIAL_SHADOW_RECEIVER_BIT (1 << 0)
97 #define CORE_MATERIAL_SHADOW_CASTER_BIT (1 << 1)
98 #define CORE_MATERIAL_NORMAL_MAP_BIT (1 << 2)
99 #define CORE_MATERIAL_TEXTURE_TRANSFORM_BIT (1 << 3)
100 #define CORE_MATERIAL_CLEARCOAT_BIT (1 << 4)
101 #define CORE_MATERIAL_TRANSMISSION_BIT (1 << 5)
102 #define CORE_MATERIAL_SHEEN_BIT (1 << 6)
103 #define CORE_MATERIAL_ADDITIONAL_SHADER_DISCARD_BIT (1 << 7)
104 #define CORE_MATERIAL_OPAQUE_BIT (1 << 8)
105 #define CORE_MATERIAL_SPECULAR_BIT (1 << 9)
106 #define CORE_MATERIAL_PUNCTUAL_LIGHT_RECEIVER_BIT (1 << 10)
107 #define CORE_MATERIAL_INDIRECT_LIGHT_RECEIVER_BIT (1 << 11)
108 // basic (1 << 12)
109 // complex (1 << 13)
110 #define CORE_MATERIAL_GPU_INSTANCING_BIT (1 << 14)
111 
112 // needs to match api/core/render/intf_render_data_store_default_light LightingFlagBits
113 #define CORE_LIGHTING_SHADOW_TYPE_VSM_BIT (1 << 0)
114 #define CORE_LIGHTING_POINT_ENABLED_BIT (1 << 1)
115 #define CORE_LIGHTING_SPOT_ENABLED_BIT (1 << 2)
116 
117 // needs to match LumeEngine/3D/api/3d/render/render_data_defines_3d.h RenderSubmeshFlagBits
118 #define CORE_SUBMESH_TANGENTS_BIT (1 << 0)
119 #define CORE_SUBMESH_VERTEX_COLORS_BIT (1 << 1)
120 #define CORE_SUBMESH_SKIN_BIT (1 << 2)
121 #define CORE_SUBMESH_SECOND_TEXCOORD_BIT (1 << 3)
122 #define CORE_SUBMESH_INVERSE_WINDING_BIT (1 << 4) // usually not controlled in shader
123 #define CORE_SUBMESH_VELOCITY_BIT (1 << 5)        // defines that one should calculate correct velocity
124 
125 // needs to match render_data_defines.h LightUsageFlagBits
126 #define CORE_LIGHT_USAGE_DIRECTIONAL_LIGHT_BIT (1 << 0)
127 #define CORE_LIGHT_USAGE_POINT_LIGHT_BIT (1 << 1)
128 #define CORE_LIGHT_USAGE_SPOT_LIGHT_BIT (1 << 2)
129 #define CORE_LIGHT_USAGE_SHADOW_LIGHT_BIT (1 << 3)
130 
131 // CORE_CAMERA_FLAGS related to render_data_defines_3d.h CameraShaderFlags
132 #define CORE_CAMERA_FOG_BIT (1 << 0)
133 
134 // needs to match api/core/render/render_data_defines.h BackgroundType
135 #define CORE_BACKGROUND_TYPE_IMAGE 1
136 #define CORE_BACKGROUND_TYPE_CUBEMAP 2
137 #define CORE_BACKGROUND_TYPE_EQUIRECTANGULAR 3
138 
139 #define CORE_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT 256
140 // 16kB min limit
141 #define CORE_MAX_MESH_MATRIX_UBO_ELEMENT_COUNT 64
142 #define CORE_MAX_MESH_MATRIX_UBO_USER_DATA_COUNT 2
143 #define CORE_MAX_MATERIAL_UBO_ELEMENT_COUNT 64
144 
145 // 16 * sizeof(uvec4) -> 256 (CORE_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT)
146 #define CORE_MAX_MATERIAL_UBO_USER_DATA_COUNT 16u
147 
148 #define CORE_DEFAULT_MATERIAL_MAX_JOINT_COUNT 256u
149 #define CORE_DEFAULT_MATERIAL_PREV_JOINT_OFFSET 128u
150 
151 #define CORE_DEFAULT_MATERIAL_MAX_LIGHT_COUNT 64
152 #define CORE_DEFAULT_MATERIAL_MAX_CAMERA_COUNT 16
153 #define CORE_DEFAULT_MATERIAL_MAX_ENVIRONMENT_COUNT 8
154 
155 #define CORE_DEFAULT_MATERIAL_MAX_SH_VEC3_VALUE_COUNT 9
156 
157 #define CORE_DEFAULT_MATERIAL_TEXTURE_TRANSFORM_COUNT 5
158 #define CORE_DEFAULT_MATERIAL_USER_DATA_VEC4_COUNT 8
159 
160 #define CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_LEFT 0
161 #define CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_RIGHT 1
162 #define CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_BOTTOM 2
163 #define CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_TOP 3
164 #define CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_NEAR 4
165 #define CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_FAR 5
166 #define CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_COUNT 6
167 
168 #else
169 
170 // aligned for 256 with indices uvec4 bytes
171 constexpr uint32_t CORE_MATERIAL_FACTOR_UNIFORM_VEC4_COUNT { 15u };
172 constexpr uint32_t CORE_MATERIAL_PACKED_UNIFORM_UVEC4_COUNT { 15u };
173 
174 // factor indices
175 constexpr uint32_t CORE_MATERIAL_FACTOR_BASE_IDX { 0u };
176 constexpr uint32_t CORE_MATERIAL_FACTOR_NORMAL_IDX { 1 };
177 constexpr uint32_t CORE_MATERIAL_FACTOR_MATERIAL_IDX { 2 };
178 constexpr uint32_t CORE_MATERIAL_FACTOR_EMISSIVE_IDX { 3 };
179 constexpr uint32_t CORE_MATERIAL_FACTOR_AO_IDX { 4 };
180 constexpr uint32_t CORE_MATERIAL_FACTOR_CLEARCOAT_IDX { 5 };
181 constexpr uint32_t CORE_MATERIAL_FACTOR_CLEARCOAT_ROUGHNESS_IDX { 6 };
182 constexpr uint32_t CORE_MATERIAL_FACTOR_CLEARCOAT_NORMAL_IDX { 7 };
183 constexpr uint32_t CORE_MATERIAL_FACTOR_SHEEN_IDX { 8 };
184 constexpr uint32_t CORE_MATERIAL_FACTOR_TRANSMISSION_IDX { 9 };
185 constexpr uint32_t CORE_MATERIAL_FACTOR_SPECULAR_IDX { 10 };
186 
187 // packed texture transforms
188 constexpr uint32_t CORE_MATERIAL_PACK_TEX_BASE_COLOR_UV_IDX { 0u };
189 constexpr uint32_t CORE_MATERIAL_PACK_TEX_NORMAL_UV_IDX { 1u };
190 constexpr uint32_t CORE_MATERIAL_PACK_TEX_MATERIAL_UV_IDX { 2u };
191 constexpr uint32_t CORE_MATERIAL_PACK_TEX_EMISSIVE_UV_IDX { 3u };
192 constexpr uint32_t CORE_MATERIAL_PACK_TEX_AO_UV_IDX { 4u };
193 constexpr uint32_t CORE_MATERIAL_PACK_TEX_CLEARCOAT_UV_IDX { 5u };
194 constexpr uint32_t CORE_MATERIAL_PACK_TEX_CLEARCOAT_ROUGHNESS_UV_IDX { 6u };
195 constexpr uint32_t CORE_MATERIAL_PACK_TEX_CLEARCOAT_NORMAL_UV_IDX { 7u };
196 constexpr uint32_t CORE_MATERIAL_PACK_TEX_SHEEN_UV_IDX { 8u };
197 constexpr uint32_t CORE_MATERIAL_PACK_TEX_TRANSMISSION_UV_IDX { 9u };
198 constexpr uint32_t CORE_MATERIAL_PACK_TEX_SPECULAR_UV_IDX { 10u };
199 constexpr uint32_t CORE_MATERIAL_PACK_ADDITIONAL_IDX { 11u };
200 
201 // matches PipelineLayoutConstants::MIN_UBO_BIND_OFFSET_ALIGNMENT_BYTE_SIZE
202 constexpr uint32_t CORE_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT { 256u };
203 constexpr uint32_t CORE_UNIFORM_BUFFER_MAX_BIND_SIZE { 1024u * 16u };
204 // 16kB min limit
205 constexpr uint32_t CORE_MAX_MESH_MATRIX_UBO_ELEMENT_COUNT { 64u };
206 constexpr uint32_t CORE_MAX_MESH_MATRIX_UBO_USER_DATA_COUNT { 2u };
207 constexpr uint32_t CORE_MAX_MATERIAL_UBO_ELEMENT_COUNT { 64u };
208 
209 // 16 * sizeof(uvec4) -> 256 (CORE_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT)
210 constexpr uint32_t CORE_MAX_MATERIAL_UBO_USER_DATA_COUNT { 16u };
211 
212 constexpr uint32_t CORE_DEFAULT_MATERIAL_MAX_JOINT_COUNT { 256u };
213 constexpr uint32_t CORE_DEFAULT_MATERIAL_PREV_JOINT_OFFSET { 128u };
214 
215 constexpr uint32_t CORE_DEFAULT_MATERIAL_MAX_LIGHT_COUNT { 64u };
216 constexpr uint32_t CORE_DEFAULT_MATERIAL_MAX_CAMERA_COUNT { 16u };
217 constexpr uint32_t CORE_DEFAULT_MATERIAL_MAX_ENVIRONMENT_COUNT { 8u };
218 
219 constexpr uint32_t CORE_DEFAULT_MATERIAL_MAX_SH_VEC3_VALUE_COUNT { 9u };
220 
221 constexpr uint32_t CORE_DEFAULT_MATERIAL_TEXTURE_TRANSFORM_COUNT { 5u };
222 constexpr uint32_t CORE_DEFAULT_MATERIAL_USER_DATA_VEC4_COUNT { 8u };
223 
224 constexpr uint32_t CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_LEFT { 0u };
225 constexpr uint32_t CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_RIGHT { 1 };
226 constexpr uint32_t CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_BOTTOM { 2 };
227 constexpr uint32_t CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_TOP { 3 };
228 constexpr uint32_t CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_NEAR { 4 };
229 constexpr uint32_t CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_FAR { 5 };
230 constexpr uint32_t CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_COUNT { 6 };
231 
232 #endif
233 
234 struct DefaultMaterialSingleMeshStruct {
235     // currently using offsets in binding CORE_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT
236 
237     mat4 world;
238     mat4 normalWorld; // NOTE: not implemented yet
239     mat4 prevWorld;
240 
241     // .xy render mesh id, .zw mesh id (64 bit id, with 32 bit info usually meaningfull)
242     uvec4 indices;
243     // layers, .xy layer mask
244     uvec4 layers;
245     // custom data
246     uvec4 customData[CORE_MAX_MESH_MATRIX_UBO_USER_DATA_COUNT];
247 };
248 // by default GPU instancing enablers are active
249 struct DefaultMaterialMeshStruct {
250     DefaultMaterialSingleMeshStruct mesh[CORE_MAX_MESH_MATRIX_UBO_ELEMENT_COUNT];
251 };
252 
253 struct DefaultMaterialSingleMaterialStruct {
254     vec4 factors[CORE_MATERIAL_FACTOR_UNIFORM_VEC4_COUNT];
255     uvec4 indices;
256 };
257 // by default GPU instancing enablers are active
258 struct DefaultMaterialMaterialStruct {
259     DefaultMaterialSingleMaterialStruct material[CORE_MAX_MATERIAL_UBO_ELEMENT_COUNT];
260 };
261 
262 struct DefaultMaterialTransformSingleMaterialStruct {
263     uvec4 packed[CORE_MATERIAL_FACTOR_UNIFORM_VEC4_COUNT];
264     uvec4 indices;
265 };
266 // by default GPU instancing enablers are active
267 struct DefaultMaterialTransformMaterialStruct {
268     DefaultMaterialTransformSingleMaterialStruct material[CORE_MAX_MATERIAL_UBO_ELEMENT_COUNT];
269 };
270 
271 struct DefaultMaterialSingleUserMaterialStruct {
272     uvec4 userData[CORE_MAX_MATERIAL_UBO_USER_DATA_COUNT];
273 };
274 // by default GPU instancing enablers are active
275 struct DefaultMaterialUserMaterialStruct {
276     DefaultMaterialSingleUserMaterialStruct material[CORE_MAX_MATERIAL_UBO_ELEMENT_COUNT];
277 };
278 
279 struct DefaultMaterialSingleLightStruct {
280     vec4 pos;
281     // .w is range
282     vec4 dir;
283     // intensity baked into rgb, .w is intensity (if needs to be inverse multiplied)
284     vec4 color;
285     // .x is inner cone angle, .y is outer cone angle, .z is light angle scale, .w is light angle offset
286     vec4 spotLightParams;
287     // .x = shadow strength, .y = depth bias, .z = normal bias, .w = shadow uv step size
288     vec4 shadowFactors;
289     // additional factors for customization
290     vec4 additionalFactor;
291 
292     // .x is light flags, .y is shadow camera idx, .z is shadow idx in atlas, .w is shadow count
293     uvec4 flags;
294     // .xy = unique id (64-bit), .zw = layer mask (64 bit)
295     uvec4 indices;
296 };
297 
298 struct DefaultMaterialLightStruct {
299     uint directionalLightBeginIndex;
300     uint directionalLightCount;
301 
302     uint pointLightBeginIndex;
303     uint pointLightCount;
304 
305     uint spotLightBeginIndex;
306     uint spotLightCount;
307 
308     uint pad0;
309     uint pad1;
310 
311     uvec4 clusterSizes;
312     vec4 clusterFactors;
313 
314     vec4 atlasSizeInvSize;
315     vec4 additionalFactors;
316 
317     DefaultMaterialSingleLightStruct lights[CORE_DEFAULT_MATERIAL_MAX_LIGHT_COUNT];
318 };
319 
320 struct DefaultMaterialSkinStruct {
321     // previous frame matrices in offset CORE_DEFAULT_MATERIAL_PREV_JOINT_OFFSET
322     mat4 jointMatrices[CORE_DEFAULT_MATERIAL_MAX_JOINT_COUNT];
323 };
324 
325 // can change per camera
326 struct DefaultMaterialGeneralDataStruct {
327     // .x is render camera index
328     uvec4 indices;
329     // .xy is viewport size 0 - size, .zw is inv viewport size
330     vec4 viewportSizeInvViewportSize;
331     // .x = scene delta time (ms), .y = tick delta time (ms), .z = tick total time (s), .w = frame index (asuint)
332     vec4 sceneTimingData;
333 };
334 
335 // can change per camera
336 struct DefaultMaterialEnvironmentStruct {
337     // .rgb is tint * intensity (intensity baked into rgb), .a is intensity
338     vec4 indirectSpecularColorFactor;
339     // .rgb = tint * intensity (intensity baked into rgb), .a is intensity
340     vec4 indirectDiffuseColorFactor;
341     // .rgb = tint * intensity (intensity baked into rgb), .a is intensity
342     vec4 envMapColorFactor;
343     // .r = radiance cubemap mip count, .g = specular cubemap lod level
344     vec4 values;
345     // blender factor for multi-env case
346     vec4 blendFactor;
347 
348     // Environment rotation matrix.
349     mat4 envRotation;
350 
351     // .xy = unique id (64-bit), .zw = layer mask (64 bit)
352     uvec4 indices;
353 
354     // spherical harmonics for indirect diffuse environment lighting (3 bands)
355     vec4 shIndirectCoefficients[CORE_DEFAULT_MATERIAL_MAX_SH_VEC3_VALUE_COUNT];
356 
357     // padding
358     vec4 pad0;
359 };
360 
361 struct DefaultMaterialFogStruct {
362     // .xy = unique id (64 bit), .zw = layer mask (64 bit)
363     uvec4 indices;
364 
365     // .x = density, .y = heightFalloff, .z = heightFogOffset
366     vec4 firstLayer;
367     // .x = density, .y = heightFalloff, .z = heightFogOffset
368     vec4 secondLayer;
369 
370     // .x = startDistance, .y = cutoffDistance, .z = maxOpacity
371     vec4 baseFactors;
372     // primary color for the fog (.rgb = tint, .a = intensity)
373     vec4 inscatteringColor;
374     // env map color factor (.rgb = tint, .a = intensity)
375     vec4 envMapFactor;
376 
377     // Additional custom factor
378     vec4 additionalFactor;
379 };
380 
381 // camera data
382 struct DefaultCameraMatrixStruct {
383     mat4 view;
384     mat4 proj;
385     mat4 viewProj;
386 
387     mat4 viewInv;
388     mat4 projInv;
389     mat4 viewProjInv;
390 
391     mat4 viewPrevFrame;
392     mat4 projPrevFrame;
393     mat4 viewProjPrevFrame;
394 
395     mat4 shadowViewProj;
396     mat4 shadowViewProjInv;
397 
398     // .xy = jitter offset, .zw = jitter offset with baked screen size
399     vec4 jitter;
400     vec4 jitterPrevFrame;
401 
402     // .xy = unique id (64-bit), .zw = layer mask (64 bit)
403     uvec4 indices;
404     // .x multi-view camera additional layer count, .yzw 3 multi-view camera indices
405     uvec4 multiViewIndices;
406 
407     vec4 frustumPlanes[CORE_DEFAULT_CAMERA_FRUSTUM_PLANE_COUNT];
408 
409     // .x environment count
410     uvec4 counts;
411     // padding to 256
412     uvec4 pad0;
413     mat4 matPad0;
414     mat4 matPad1;
415 };
416 
417 #ifdef VULKAN
418 
419 // General data unpacking
420 
421 struct DefaultMaterialUnpackedSceneTimingStruct {
422     // scene delta time (ms)
423     float sceneDeltaTime;
424     // tick delta time (ms)
425     float tickDeltaTime;
426     // tick total time (s)
427     float tickTotalTime;
428     // frame index of the current ECS scene render system
429     uint frameIndex;
430 };
431 
432 struct DefaultMaterialUnpackedPostProcessStruct {
433     float tonemapExposure;
434     float vignetteCoeff;
435     float vignettePower;
436 };
437 
GetPackFlatIndices(const uint cameraIdx,const uint instanceIdx)438 uint GetPackFlatIndices(const uint cameraIdx, const uint instanceIdx)
439 {
440     return ((instanceIdx << 16) | (cameraIdx & 0xffff)); // 16 : bit size
441 }
442 
GetUnpackFlatIndices(in uint indices,out uint cameraIdx,out uint instanceIdx)443 void GetUnpackFlatIndices(in uint indices, out uint cameraIdx, out uint instanceIdx)
444 {
445     cameraIdx = indices & 0xffff;
446     instanceIdx = indices >> 16;
447 }
448 
GetUnpackFlatIndicesInstanceIdx(in uint indices)449 uint GetUnpackFlatIndicesInstanceIdx(in uint indices)
450 {
451     return (indices >> 16);
452 }
453 
GetUnpackFlatIndicesCameraIdx(in uint indices)454 uint GetUnpackFlatIndicesCameraIdx(in uint indices)
455 {
456     return (indices & 0xffff);
457 }
458 
GetUnpackCameraIndex(const DefaultMaterialGeneralDataStruct dmgds)459 uint GetUnpackCameraIndex(const DefaultMaterialGeneralDataStruct dmgds)
460 {
461     return dmgds.indices.x;
462 }
463 
GetUnpackSceneTiming(const DefaultMaterialGeneralDataStruct dmgds)464 DefaultMaterialUnpackedSceneTimingStruct GetUnpackSceneTiming(const DefaultMaterialGeneralDataStruct dmgds)
465 {
466     DefaultMaterialUnpackedSceneTimingStruct dm;
467     dm.sceneDeltaTime = dmgds.sceneTimingData.x;
468     dm.tickDeltaTime = dmgds.sceneTimingData.y;
469     dm.tickTotalTime = dmgds.sceneTimingData.z;
470     dm.frameIndex = floatBitsToUint(dmgds.sceneTimingData.w);
471     return dm;
472 }
473 
GetUnpackViewport(const DefaultMaterialGeneralDataStruct dmgds)474 vec4 GetUnpackViewport(const DefaultMaterialGeneralDataStruct dmgds)
475 {
476     return dmgds.viewportSizeInvViewportSize;
477 }
478 
479 // Default material unpacking
480 
481 struct DefaultMaterialUnpackedTexTransformStruct {
482     vec4 rotateScale;
483     vec2 translate;
484 };
485 
GetUnpackTextureTransform(const uvec4 packedTexTransform)486 DefaultMaterialUnpackedTexTransformStruct GetUnpackTextureTransform(const uvec4 packedTexTransform)
487 {
488     DefaultMaterialUnpackedTexTransformStruct dm;
489     dm.rotateScale = UnpackVec4Half2x16(packedTexTransform.xy);
490     dm.translate = UnpackVec4Half2x16(packedTexTransform.zw).xy;
491     return dm;
492 }
493 
494 // DEPRECATED base methods with struct inputs
495 #ifdef CORE3D_USE_DEPRECATED_UNPACK_METHODS
496 
GetUnpackBaseColor(const DefaultMaterialMaterialStruct dmms)497 vec4 GetUnpackBaseColor(const DefaultMaterialMaterialStruct dmms)
498 {
499     return dmms.material[0].factors[CORE_MATERIAL_FACTOR_BASE_IDX];
500 }
GetUnpackBaseColor(const DefaultMaterialMaterialStruct dmms,const uint instanceIdx)501 vec4 GetUnpackBaseColor(const DefaultMaterialMaterialStruct dmms, const uint instanceIdx)
502 {
503     return dmms.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_BASE_IDX];
504 }
505 
GetUnpackMaterial(const DefaultMaterialMaterialStruct dmms)506 vec4 GetUnpackMaterial(const DefaultMaterialMaterialStruct dmms)
507 {
508     return dmms.material[0].factors[CORE_MATERIAL_FACTOR_MATERIAL_IDX];
509 }
GetUnpackMaterial(const DefaultMaterialMaterialStruct dmms,const uint instanceIdx)510 vec4 GetUnpackMaterial(const DefaultMaterialMaterialStruct dmms, const uint instanceIdx)
511 {
512     return dmms.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_MATERIAL_IDX];
513 }
514 
GetUnpackAO(const DefaultMaterialMaterialStruct dmms)515 float GetUnpackAO(const DefaultMaterialMaterialStruct dmms)
516 {
517     return dmms.material[0].factors[CORE_MATERIAL_FACTOR_AO_IDX].x;
518 }
GetUnpackAO(const DefaultMaterialMaterialStruct dmms,const uint instanceIdx)519 float GetUnpackAO(const DefaultMaterialMaterialStruct dmms, const uint instanceIdx)
520 {
521     return dmms.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_AO_IDX].x;
522 }
523 
GetUnpackClearcoat(const DefaultMaterialMaterialStruct dmms)524 float GetUnpackClearcoat(const DefaultMaterialMaterialStruct dmms)
525 {
526     return dmms.material[0].factors[CORE_MATERIAL_FACTOR_CLEARCOAT_IDX].x;
527 }
GetUnpackClearcoat(const DefaultMaterialMaterialStruct dmms,const uint instanceIdx)528 float GetUnpackClearcoat(const DefaultMaterialMaterialStruct dmms, const uint instanceIdx)
529 {
530     return dmms.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_CLEARCOAT_IDX].x;
531 }
532 
533 // NOTE: sampling from .y
GetUnpackClearcoatRoughness(const DefaultMaterialMaterialStruct dmms)534 float GetUnpackClearcoatRoughness(const DefaultMaterialMaterialStruct dmms)
535 {
536     return dmms.material[0].factors[CORE_MATERIAL_FACTOR_CLEARCOAT_ROUGHNESS_IDX].y;
537 }
GetUnpackClearcoatRoughness(const DefaultMaterialMaterialStruct dmms,const uint instanceIdx)538 float GetUnpackClearcoatRoughness(const DefaultMaterialMaterialStruct dmms, const uint instanceIdx)
539 {
540     return dmms.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_CLEARCOAT_ROUGHNESS_IDX].y;
541 }
542 
543 // .xyz = sheen factor, .w = sheen roughness
GetUnpackSheen(const DefaultMaterialMaterialStruct dmms)544 vec4 GetUnpackSheen(const DefaultMaterialMaterialStruct dmms)
545 {
546     return dmms.material[0].factors[CORE_MATERIAL_FACTOR_SHEEN_IDX];
547 }
GetUnpackSheen(const DefaultMaterialMaterialStruct dmms,const uint instanceIdx)548 vec4 GetUnpackSheen(const DefaultMaterialMaterialStruct dmms, const uint instanceIdx)
549 {
550     return dmms.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_SHEEN_IDX];
551 }
552 
GetUnpackTransmission(const DefaultMaterialMaterialStruct dmms)553 float GetUnpackTransmission(const DefaultMaterialMaterialStruct dmms)
554 {
555     return dmms.material[0].factors[CORE_MATERIAL_FACTOR_TRANSMISSION_IDX].x;
556 }
GetUnpackTransmission(const DefaultMaterialMaterialStruct dmms,const uint instanceIdx)557 float GetUnpackTransmission(const DefaultMaterialMaterialStruct dmms, const uint instanceIdx)
558 {
559     return dmms.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_TRANSMISSION_IDX].x;
560 }
561 
562 // .xyz = specular color, .w = specular strength
GetUnpackSpecular(const DefaultMaterialMaterialStruct dmms)563 vec4 GetUnpackSpecular(const DefaultMaterialMaterialStruct dmms)
564 {
565     return dmms.material[0].factors[CORE_MATERIAL_FACTOR_SPECULAR_IDX];
566 }
GetUnpackSpecular(const DefaultMaterialMaterialStruct dmms,const uint instanceIdx)567 vec4 GetUnpackSpecular(const DefaultMaterialMaterialStruct dmms, const uint instanceIdx)
568 {
569     return dmms.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_SPECULAR_IDX];
570 }
571 
GetUnpackEmissiveColor(const DefaultMaterialMaterialStruct dmms)572 vec3 GetUnpackEmissiveColor(const DefaultMaterialMaterialStruct dmms)
573 {
574     const vec4 emissive = dmms.material[0].factors[CORE_MATERIAL_FACTOR_EMISSIVE_IDX];
575     return emissive.rgb * emissive.a;
576 }
GetUnpackEmissiveColor(const DefaultMaterialMaterialStruct dmms,const uint instanceIdx)577 vec3 GetUnpackEmissiveColor(const DefaultMaterialMaterialStruct dmms, const uint instanceIdx)
578 {
579     const vec4 emissive = dmms.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_EMISSIVE_IDX];
580     return emissive.rgb * emissive.a;
581 }
582 
GetUnpackNormalScale(const DefaultMaterialMaterialStruct dmms)583 float GetUnpackNormalScale(const DefaultMaterialMaterialStruct dmms)
584 {
585     return dmms.material[0].factors[CORE_MATERIAL_FACTOR_NORMAL_IDX].x;
586 }
GetUnpackNormalScale(const DefaultMaterialMaterialStruct dmms,const uint instanceIdx)587 float GetUnpackNormalScale(const DefaultMaterialMaterialStruct dmms, const uint instanceIdx)
588 {
589     return dmms.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_NORMAL_IDX].x;
590 }
591 
GetUnpackAlphaCutoff(const DefaultMaterialMaterialStruct dmms)592 float GetUnpackAlphaCutoff(const DefaultMaterialMaterialStruct dmms)
593 {
594     return dmms.material[0].factors[CORE_MATERIAL_FACTOR_ADDITIONAL_IDX].x;
595 }
GetUnpackAlphaCutoff(const DefaultMaterialMaterialStruct dmms,const uint instanceIdx)596 float GetUnpackAlphaCutoff(const DefaultMaterialMaterialStruct dmms, const uint instanceIdx)
597 {
598     return dmms.material[instanceIdx].factors[CORE_MATERIAL_FACTOR_ADDITIONAL_IDX].x;
599 }
600 
GetUnpackMaterialTextureInfoSlotFactor(const DefaultMaterialMaterialStruct dmms,const uint materialIndexSlot)601 vec4 GetUnpackMaterialTextureInfoSlotFactor(const DefaultMaterialMaterialStruct dmms, const uint materialIndexSlot)
602 {
603     const uint maxIndex = min(materialIndexSlot, CORE_MATERIAL_FACTOR_UNIFORM_VEC4_COUNT - 1);
604     return dmms.material[0].factors[maxIndex].xyzw;
605 }
GetUnpackMaterialTextureInfoSlotFactor(const DefaultMaterialMaterialStruct dmms,const uint materialIndexSlot,const uint instanceIdx)606 vec4 GetUnpackMaterialTextureInfoSlotFactor(
607     const DefaultMaterialMaterialStruct dmms, const uint materialIndexSlot, const uint instanceIdx)
608 {
609     const uint maxIndex = min(materialIndexSlot, CORE_MATERIAL_FACTOR_UNIFORM_VEC4_COUNT - 1);
610     return dmms.material[instanceIdx].factors[maxIndex].xyzw;
611 }
612 
613 // transform = high bits (16)
614 // uv set bit = low bits (0)
GetUnpackTexCoordInfo(const DefaultMaterialMaterialStruct dmms)615 uint GetUnpackTexCoordInfo(const DefaultMaterialMaterialStruct dmms)
616 {
617     return floatBitsToUint(dmms.material[0].factors[CORE_MATERIAL_FACTOR_ADDITIONAL_IDX].y);
618 }
619 
620 // transform = high bits (16)
621 // uv set bit = low bits (0)
GetUnpackTexCoordInfo(const DefaultMaterialTransformMaterialStruct dmms)622 uint GetUnpackTexCoordInfo(const DefaultMaterialTransformMaterialStruct dmms)
623 {
624     return dmms.material[0].packed[CORE_MATERIAL_PACK_ADDITIONAL_IDX].y;
625 }
626 
627 #endif // CORE3D_USE_DEPRECATED_UNPACK_METHODS
628 
629 #endif
630 
631 #endif // SHADERS__COMMON__3D_DEFAULT_MATERIAL_STRUCTURES_COMMON_H
632