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