@zephyr3d/scene 0.9.24 → 0.9.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  2. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  3. package/dist/animation/joint_dynamics/controller.js +7 -5
  4. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  5. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  6. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  7. package/dist/animation/morphtrack.js +3 -4
  8. package/dist/animation/morphtrack.js.map +1 -1
  9. package/dist/animation/skeleton.js +58 -24
  10. package/dist/animation/skeleton.js.map +1 -1
  11. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  12. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  13. package/dist/animation/spring/spring_collider.js +4 -3
  14. package/dist/animation/spring/spring_collider.js.map +1 -1
  15. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  16. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  17. package/dist/animation/spring/spring_particle.js +2 -0
  18. package/dist/animation/spring/spring_particle.js.map +1 -1
  19. package/dist/animation/spring/spring_system.js +11 -3
  20. package/dist/animation/spring/spring_system.js.map +1 -1
  21. package/dist/animation/spring_modifier.js +10 -0
  22. package/dist/animation/spring_modifier.js.map +1 -1
  23. package/dist/app/engine.js +53 -43
  24. package/dist/app/engine.js.map +1 -1
  25. package/dist/app/scriptingsystem.js +119 -6
  26. package/dist/app/scriptingsystem.js.map +1 -1
  27. package/dist/app/scriptregistry.js +3 -2
  28. package/dist/app/scriptregistry.js.map +1 -1
  29. package/dist/asset/assetmanager.js +284 -67
  30. package/dist/asset/assetmanager.js.map +1 -1
  31. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  32. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  33. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  34. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  35. package/dist/asset/model.js +178 -67
  36. package/dist/asset/model.js.map +1 -1
  37. package/dist/camera/camera.js +193 -21
  38. package/dist/camera/camera.js.map +1 -1
  39. package/dist/camera/perspectivecamera.js +3 -1
  40. package/dist/camera/perspectivecamera.js.map +1 -1
  41. package/dist/index.d.ts +4040 -1290
  42. package/dist/index.js +16 -6
  43. package/dist/index.js.map +1 -1
  44. package/dist/material/eye.js +932 -0
  45. package/dist/material/eye.js.map +1 -0
  46. package/dist/material/hair.js +917 -0
  47. package/dist/material/hair.js.map +1 -0
  48. package/dist/material/hairstrand.js +842 -0
  49. package/dist/material/hairstrand.js.map +1 -0
  50. package/dist/material/hairstrand_data.js +162 -0
  51. package/dist/material/hairstrand_data.js.map +1 -0
  52. package/dist/material/lambert.js +5 -2
  53. package/dist/material/lambert.js.map +1 -1
  54. package/dist/material/material.js +338 -300
  55. package/dist/material/material.js.map +1 -1
  56. package/dist/material/meshmaterial.js +120 -19
  57. package/dist/material/meshmaterial.js.map +1 -1
  58. package/dist/material/mixins/albedocolor.js +1 -1
  59. package/dist/material/mixins/albedocolor.js.map +1 -1
  60. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  61. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  62. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  63. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  65. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  67. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  70. package/dist/material/mixins/lit.js +73 -18
  71. package/dist/material/mixins/lit.js.map +1 -1
  72. package/dist/material/mixins/pbr/common.js +4 -4
  73. package/dist/material/mixins/pbr/common.js.map +1 -1
  74. package/dist/material/mixins/texture.js +48 -11
  75. package/dist/material/mixins/texture.js.map +1 -1
  76. package/dist/material/mtoon.js +6 -5
  77. package/dist/material/mtoon.js.map +1 -1
  78. package/dist/material/pbrblueprint.js +146 -28
  79. package/dist/material/pbrblueprint.js.map +1 -1
  80. package/dist/material/pbrblueprint_instance.js +501 -0
  81. package/dist/material/pbrblueprint_instance.js.map +1 -0
  82. package/dist/material/pbrmr.js +15 -16
  83. package/dist/material/pbrmr.js.map +1 -1
  84. package/dist/material/shader/helper.js +766 -456
  85. package/dist/material/shader/helper.js.map +1 -1
  86. package/dist/material/shader/terrain_blend.js +55 -0
  87. package/dist/material/shader/terrain_blend.js.map +1 -0
  88. package/dist/material/skin.js +192 -32
  89. package/dist/material/skin.js.map +1 -1
  90. package/dist/material/spriteblueprint.js +16 -1
  91. package/dist/material/spriteblueprint.js.map +1 -1
  92. package/dist/material/subsurfaceprofile.js +86 -23
  93. package/dist/material/subsurfaceprofile.js.map +1 -1
  94. package/dist/material/water.js +3 -1
  95. package/dist/material/water.js.map +1 -1
  96. package/dist/posteffect/bloom.js +167 -7
  97. package/dist/posteffect/bloom.js.map +1 -1
  98. package/dist/posteffect/coloradjust.js +2 -1
  99. package/dist/posteffect/coloradjust.js.map +1 -1
  100. package/dist/posteffect/compositor.js.map +1 -1
  101. package/dist/posteffect/fxaa.js +2 -1
  102. package/dist/posteffect/fxaa.js.map +1 -1
  103. package/dist/posteffect/grayscale.js +3 -1
  104. package/dist/posteffect/grayscale.js.map +1 -1
  105. package/dist/posteffect/motionblur.js +4 -1
  106. package/dist/posteffect/motionblur.js.map +1 -1
  107. package/dist/posteffect/posteffect.js.map +1 -1
  108. package/dist/posteffect/skinsss.js +368 -69
  109. package/dist/posteffect/skinsss.js.map +1 -1
  110. package/dist/posteffect/ssgi.js +16 -9
  111. package/dist/posteffect/ssgi.js.map +1 -1
  112. package/dist/posteffect/ssr.js +3 -0
  113. package/dist/posteffect/ssr.js.map +1 -1
  114. package/dist/posteffect/sss.js +91 -34
  115. package/dist/posteffect/sss.js.map +1 -1
  116. package/dist/posteffect/taa.js.map +1 -1
  117. package/dist/posteffect/tonemap.js +44 -1
  118. package/dist/posteffect/tonemap.js.map +1 -1
  119. package/dist/render/abuffer_oit.js +45 -39
  120. package/dist/render/abuffer_oit.js.map +1 -1
  121. package/dist/render/cluster_light.js +4 -4
  122. package/dist/render/cluster_light.js.map +1 -1
  123. package/dist/render/cull_visitor.js +19 -0
  124. package/dist/render/cull_visitor.js.map +1 -1
  125. package/dist/render/depthpass.js +36 -2
  126. package/dist/render/depthpass.js.map +1 -1
  127. package/dist/render/drawable_mixin.js +26 -1
  128. package/dist/render/drawable_mixin.js.map +1 -1
  129. package/dist/render/dualdepthpeeling_oit.js +52 -51
  130. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  131. package/dist/render/envlight.js +1 -1
  132. package/dist/render/envlight.js.map +1 -1
  133. package/dist/render/fbm_wavegenerator.js +3 -0
  134. package/dist/render/fbm_wavegenerator.js.map +1 -1
  135. package/dist/render/gerstner_wavegenerator.js +3 -0
  136. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  137. package/dist/render/globalbindgroup_allocator.js +3 -0
  138. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  139. package/dist/render/oit.js +29 -0
  140. package/dist/render/oit.js.map +1 -0
  141. package/dist/render/render_queue.js +3 -0
  142. package/dist/render/render_queue.js.map +1 -1
  143. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  144. package/dist/render/rendergraph/executor.js +2 -0
  145. package/dist/render/rendergraph/executor.js.map +1 -1
  146. package/dist/render/rendergraph/forward_plus_builder.js +61 -1
  147. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  148. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  149. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  150. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  151. package/dist/render/rendergraph/types.js.map +1 -1
  152. package/dist/render/shadow_mask_pass.js +73 -8
  153. package/dist/render/shadow_mask_pass.js.map +1 -1
  154. package/dist/render/sky.js +166 -126
  155. package/dist/render/sky.js.map +1 -1
  156. package/dist/render/weightedblended_oit.js +36 -35
  157. package/dist/render/weightedblended_oit.js.map +1 -1
  158. package/dist/scene/basesprite.js +8 -0
  159. package/dist/scene/basesprite.js.map +1 -1
  160. package/dist/scene/batchgroup.js +3 -0
  161. package/dist/scene/batchgroup.js.map +1 -1
  162. package/dist/scene/environment.js +4 -1
  163. package/dist/scene/environment.js.map +1 -1
  164. package/dist/scene/hair.js +963 -0
  165. package/dist/scene/hair.js.map +1 -0
  166. package/dist/scene/light.js +5 -1
  167. package/dist/scene/light.js.map +1 -1
  168. package/dist/scene/mesh.js +481 -47
  169. package/dist/scene/mesh.js.map +1 -1
  170. package/dist/scene/meshdrawable.js +6 -0
  171. package/dist/scene/meshdrawable.js.map +1 -1
  172. package/dist/scene/msdftext.js +3 -0
  173. package/dist/scene/msdftext.js.map +1 -1
  174. package/dist/scene/msdftextsprite.js +3 -0
  175. package/dist/scene/msdftextsprite.js.map +1 -1
  176. package/dist/scene/particlesys.js +6 -0
  177. package/dist/scene/particlesys.js.map +1 -1
  178. package/dist/scene/scene.js +3 -0
  179. package/dist/scene/scene.js.map +1 -1
  180. package/dist/scene/scene_node.js +6 -1
  181. package/dist/scene/scene_node.js.map +1 -1
  182. package/dist/scene/terrain-cm/grass.js +273 -249
  183. package/dist/scene/terrain-cm/grass.js.map +1 -1
  184. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  185. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  186. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  187. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  188. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  189. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  190. package/dist/scene/water.js +6 -0
  191. package/dist/scene/water.js.map +1 -1
  192. package/dist/shaders/atmosphere.js.map +1 -1
  193. package/dist/shaders/diffusion.js +54 -0
  194. package/dist/shaders/diffusion.js.map +1 -0
  195. package/dist/shaders/shadow.js +33 -21
  196. package/dist/shaders/shadow.js.map +1 -1
  197. package/dist/shaders/temporal.js +71 -33
  198. package/dist/shaders/temporal.js.map +1 -1
  199. package/dist/shadow/dom.js +546 -0
  200. package/dist/shadow/dom.js.map +1 -0
  201. package/dist/shadow/pcf_opt.js +3 -5
  202. package/dist/shadow/pcf_opt.js.map +1 -1
  203. package/dist/shadow/pcf_pd.js +1 -1
  204. package/dist/shadow/pcf_pd.js.map +1 -1
  205. package/dist/shadow/receiver_bias.js +41 -0
  206. package/dist/shadow/receiver_bias.js.map +1 -0
  207. package/dist/shadow/shader.js +20 -60
  208. package/dist/shadow/shader.js.map +1 -1
  209. package/dist/shadow/shadow_impl.js +89 -0
  210. package/dist/shadow/shadow_impl.js.map +1 -1
  211. package/dist/shadow/shadow_region.js +50 -50
  212. package/dist/shadow/shadow_region.js.map +1 -1
  213. package/dist/shadow/shadowmapper.js +150 -37
  214. package/dist/shadow/shadowmapper.js.map +1 -1
  215. package/dist/shapes/shape.js +11 -2
  216. package/dist/shapes/shape.js.map +1 -1
  217. package/dist/shapes/sphere.js +50 -9
  218. package/dist/shapes/sphere.js.map +1 -1
  219. package/dist/utility/blueprint/common/constants.js +112 -2
  220. package/dist/utility/blueprint/common/constants.js.map +1 -1
  221. package/dist/utility/blueprint/material/func.js +142 -49
  222. package/dist/utility/blueprint/material/func.js.map +1 -1
  223. package/dist/utility/blueprint/material/ir.js +490 -25
  224. package/dist/utility/blueprint/material/ir.js.map +1 -1
  225. package/dist/utility/blueprint/material/texture.js +898 -4
  226. package/dist/utility/blueprint/material/texture.js.map +1 -1
  227. package/dist/utility/serialization/manager.js +431 -100
  228. package/dist/utility/serialization/manager.js.map +1 -1
  229. package/dist/utility/serialization/scene/animation.js +370 -3
  230. package/dist/utility/serialization/scene/animation.js.map +1 -1
  231. package/dist/utility/serialization/scene/batch.js +4 -0
  232. package/dist/utility/serialization/scene/batch.js.map +1 -1
  233. package/dist/utility/serialization/scene/camera.js +133 -1
  234. package/dist/utility/serialization/scene/camera.js.map +1 -1
  235. package/dist/utility/serialization/scene/common.js +26 -5
  236. package/dist/utility/serialization/scene/common.js.map +1 -1
  237. package/dist/utility/serialization/scene/hair.js +1141 -0
  238. package/dist/utility/serialization/scene/hair.js.map +1 -0
  239. package/dist/utility/serialization/scene/light.js +84 -4
  240. package/dist/utility/serialization/scene/light.js.map +1 -1
  241. package/dist/utility/serialization/scene/material.js +1867 -166
  242. package/dist/utility/serialization/scene/material.js.map +1 -1
  243. package/dist/utility/serialization/scene/mesh.js +231 -14
  244. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  245. package/dist/utility/serialization/scene/node.js +141 -7
  246. package/dist/utility/serialization/scene/node.js.map +1 -1
  247. package/dist/utility/serialization/scene/particle.js +4 -0
  248. package/dist/utility/serialization/scene/particle.js.map +1 -1
  249. package/dist/utility/serialization/scene/primitive.js +18 -0
  250. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  251. package/dist/utility/serialization/scene/sprite.js +4 -0
  252. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  253. package/dist/utility/serialization/scene/terrain.js +92 -69
  254. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  255. package/dist/utility/serialization/scene/text.js +4 -0
  256. package/dist/utility/serialization/scene/text.js.map +1 -1
  257. package/dist/utility/serialization/scene/water.js +4 -0
  258. package/dist/utility/serialization/scene/water.js.map +1 -1
  259. package/dist/utility/serialization/types.js.map +1 -1
  260. package/dist/utility/shprojector.js +96 -95
  261. package/dist/utility/shprojector.js.map +1 -1
  262. package/dist/values.js +105 -58
  263. package/dist/values.js.map +1 -1
  264. package/package.json +3 -3
@@ -0,0 +1,501 @@
1
+ import { Vector4, DRef } from '@zephyr3d/base';
2
+ import { getEngine } from '../app/api.js';
3
+ import { PBRBluePrintMaterial } from './pbrblueprint.js';
4
+ import { SubsurfaceProfile } from './subsurfaceprofile.js';
5
+
6
+ function cloneUniformFinalValue(value) {
7
+ if (typeof value.finalValue === 'number') {
8
+ return value.finalValue;
9
+ }
10
+ if (value.finalValue instanceof Float32Array) {
11
+ return new Float32Array(value.finalValue);
12
+ }
13
+ return value.value.length === 1 ? value.value[0] : new Float32Array(value.value);
14
+ }
15
+ function cloneTextureParams(params) {
16
+ return params instanceof Vector4 ? params.clone() : params && typeof params === 'object' && 'x' in params && 'y' in params && 'z' in params && 'w' in params ? new Vector4(Number(params.x) || 0, Number(params.y) || 0, Number(params.z) || 0, Number(params.w) || 0) : Vector4.zero();
17
+ }
18
+ function cloneUniformValues(values) {
19
+ return (values ?? []).map((v)=>({
20
+ ...v,
21
+ value: [
22
+ ...v.value
23
+ ],
24
+ finalValue: cloneUniformFinalValue(v)
25
+ }));
26
+ }
27
+ function cloneUniformTextures(values) {
28
+ return (values ?? []).map((v)=>({
29
+ ...v,
30
+ exposed: v.exposed ?? true,
31
+ params: cloneTextureParams(v.params),
32
+ finalTexture: v.finalTexture ? new DRef(v.finalTexture.get()) : undefined,
33
+ finalSampler: v.finalSampler
34
+ }));
35
+ }
36
+ function mergeHydratedUniformTexture(base, runtime) {
37
+ if (!runtime) {
38
+ return base;
39
+ }
40
+ return {
41
+ ...base,
42
+ finalTexture: runtime.finalTexture ?? base.finalTexture,
43
+ finalSampler: runtime.finalSampler ?? base.finalSampler,
44
+ params: runtime.params ?? base.params
45
+ };
46
+ }
47
+ function inheritUniformTextureMetadata(parent, override) {
48
+ return {
49
+ ...override,
50
+ type: parent.type,
51
+ exposed: parent.exposed,
52
+ sRGB: parent.sRGB,
53
+ wrapS: parent.wrapS,
54
+ wrapT: parent.wrapT,
55
+ minFilter: parent.minFilter,
56
+ magFilter: parent.magFilter,
57
+ mipFilter: parent.mipFilter,
58
+ inVertexShader: parent.inVertexShader,
59
+ inFragmentShader: parent.inFragmentShader,
60
+ finalSampler: parent.finalSampler
61
+ };
62
+ }
63
+ function mergeUniformTextureOverride(parent, override, runtime) {
64
+ const hydratedOverride = override.finalTexture ? override : runtime?.texture === override.texture ? runtime : null;
65
+ return inheritUniformTextureMetadata(parent, {
66
+ ...override,
67
+ finalTexture: hydratedOverride?.finalTexture ?? parent.finalTexture,
68
+ params: hydratedOverride?.params ?? parent.params
69
+ });
70
+ }
71
+ function uniformValueEquals(a, b) {
72
+ if (a.type !== b.type || a.value.length !== b.value.length) {
73
+ return false;
74
+ }
75
+ for(let i = 0; i < a.value.length; i++){
76
+ if (a.value[i] !== b.value[i]) {
77
+ return false;
78
+ }
79
+ }
80
+ return true;
81
+ }
82
+ function uniformTextureEquals(a, b) {
83
+ return a.type === b.type && a.texture === b.texture;
84
+ }
85
+ function valuesEqual(a, b) {
86
+ if (a === b) {
87
+ return true;
88
+ }
89
+ if (a && b && typeof a === 'object' && typeof b === 'object' && 'equalsTo' in a && typeof a.equalsTo === 'function') {
90
+ return !!a.equalsTo(b);
91
+ }
92
+ return false;
93
+ }
94
+ function copyParentMaterialState(instance, parentMaterial) {
95
+ instance.alphaCutoff = parentMaterial.alphaCutoff;
96
+ instance.alphaDither = parentMaterial.alphaDither;
97
+ instance.alphaToCoverage = parentMaterial.alphaToCoverage;
98
+ instance.blendMode = parentMaterial.blendMode;
99
+ instance.transparentShadowCaster = parentMaterial.transparentShadowCaster;
100
+ instance.shadowAlphaCutoff = parentMaterial.shadowAlphaCutoff;
101
+ instance.cullMode = parentMaterial.cullMode;
102
+ instance.opacity = parentMaterial.opacity;
103
+ instance.objectColor = parentMaterial.objectColor;
104
+ instance.TAAStrength = parentMaterial.TAAStrength;
105
+ if (!instance.isMaterialPropertyOverridden('NormalScale')) {
106
+ instance.normalScale = parentMaterial.normalScale;
107
+ }
108
+ if (!instance.isMaterialPropertyOverridden('NormalFlipY')) {
109
+ instance.normalFlipY = parentMaterial.normalFlipY;
110
+ }
111
+ if (!instance.isMaterialPropertyOverridden('doubleSidedLighting')) {
112
+ instance.doubleSidedLighting = parentMaterial.doubleSidedLighting;
113
+ }
114
+ if (!instance.isMaterialPropertyOverridden('RectSpecularScale')) {
115
+ instance.rectSpecularScale = parentMaterial.rectSpecularScale;
116
+ }
117
+ instance.clearcoat = parentMaterial.clearcoat;
118
+ instance.clearcoatIntensity = parentMaterial.clearcoatIntensity;
119
+ instance.clearcoatRoughnessFactor = parentMaterial.clearcoatRoughnessFactor;
120
+ instance.clearcoatIntensityTexture = parentMaterial.clearcoatIntensityTexture;
121
+ instance.clearcoatIntensityTextureSampler = parentMaterial.clearcoatIntensityTextureSampler;
122
+ instance.clearcoatIntensityTexCoordMatrix = parentMaterial.clearcoatIntensityTexCoordMatrix;
123
+ instance.clearcoatIntensityTexCoordIndex = parentMaterial.clearcoatIntensityTexCoordIndex;
124
+ instance.clearcoatRoughnessTexture = parentMaterial.clearcoatRoughnessTexture;
125
+ instance.clearcoatRoughnessTextureSampler = parentMaterial.clearcoatRoughnessTextureSampler;
126
+ instance.clearcoatRoughnessTexCoordMatrix = parentMaterial.clearcoatRoughnessTexCoordMatrix;
127
+ instance.clearcoatRoughnessTexCoordIndex = parentMaterial.clearcoatRoughnessTexCoordIndex;
128
+ instance.clearcoatNormalTexture = parentMaterial.clearcoatNormalTexture;
129
+ instance.clearcoatNormalTextureSampler = parentMaterial.clearcoatNormalTextureSampler;
130
+ instance.clearcoatNormalTexCoordMatrix = parentMaterial.clearcoatNormalTexCoordMatrix;
131
+ instance.clearcoatNormalTexCoordIndex = parentMaterial.clearcoatNormalTexCoordIndex;
132
+ instance.syncInheritedSubsurfaceProfile(parentMaterial.subsurfaceProfile);
133
+ if (!instance.hasReflectionModeOverride()) {
134
+ instance.setBlueprintInstanceReflectionMode(parentMaterial.reflectionMode, true);
135
+ }
136
+ }
137
+ /**
138
+ * Blueprint material instance asset.
139
+ *
140
+ * Inherits graph/IR from a parent blueprint material and only stores parameter overrides.
141
+ * Instances are asset-level indirections, distinct from MeshMaterial runtime instancing.
142
+ *
143
+ * @public
144
+ */ class PBRBluePrintMaterialInstance extends PBRBluePrintMaterial {
145
+ _parentMaterialId;
146
+ _parentMaterial;
147
+ _overrideUniformValues;
148
+ _overrideUniformTextures;
149
+ _reflectionModeOverridden;
150
+ _overrideMaterialProps;
151
+ _subsurfaceProfileOverride;
152
+ constructor(parentMaterial, parentMaterialId = ''){
153
+ super();
154
+ this._parentMaterialId = parentMaterialId;
155
+ this._parentMaterial = null;
156
+ this._overrideUniformValues = new Map();
157
+ this._overrideUniformTextures = new Map();
158
+ this._reflectionModeOverridden = false;
159
+ this._overrideMaterialProps = new Set();
160
+ this._subsurfaceProfileOverride = null;
161
+ if (parentMaterial) {
162
+ this.setParentMaterial(parentMaterial, parentMaterialId);
163
+ }
164
+ }
165
+ copyFrom(other) {
166
+ super.copyFrom(other);
167
+ if (other instanceof PBRBluePrintMaterialInstance) {
168
+ const overrideUniformValues = cloneUniformValues([
169
+ ...other._overrideUniformValues.values()
170
+ ]);
171
+ const overrideUniformTextures = cloneUniformTextures([
172
+ ...other._overrideUniformTextures.values()
173
+ ]);
174
+ const subsurfaceProfileOverride = this.copySubsurfaceProfile(other._subsurfaceProfileOverride);
175
+ for (const uniform of this._overrideUniformTextures.values()){
176
+ uniform.finalTexture?.dispose();
177
+ }
178
+ this._parentMaterial = other._parentMaterial;
179
+ this._parentMaterialId = other._parentMaterialId;
180
+ this._overrideUniformValues = new Map(overrideUniformValues.map((uniform)=>[
181
+ uniform.name,
182
+ uniform
183
+ ]));
184
+ this._overrideUniformTextures = new Map(overrideUniformTextures.map((uniform)=>[
185
+ uniform.name,
186
+ uniform
187
+ ]));
188
+ this._reflectionModeOverridden = other._reflectionModeOverridden;
189
+ this._overrideMaterialProps = new Set(other._overrideMaterialProps);
190
+ this._subsurfaceProfileOverride?.dispose();
191
+ this._subsurfaceProfileOverride = subsurfaceProfileOverride;
192
+ this.syncInheritedUniforms();
193
+ }
194
+ }
195
+ get parentMaterialId() {
196
+ return this._parentMaterialId;
197
+ }
198
+ get parentMaterial() {
199
+ return this._parentMaterial;
200
+ }
201
+ get isBlueprintMaterialInstance() {
202
+ return true;
203
+ }
204
+ get hasSubsurfaceProfileOverride() {
205
+ return !!this._subsurfaceProfileOverride;
206
+ }
207
+ setMaterialPropertyOverrides(propNames) {
208
+ this._overrideMaterialProps = new Set(propNames);
209
+ }
210
+ getMaterialPropertyOverrides() {
211
+ return [
212
+ ...this._overrideMaterialProps
213
+ ];
214
+ }
215
+ markMaterialPropertyOverridden(propName) {
216
+ this._overrideMaterialProps.add(propName);
217
+ }
218
+ isMaterialPropertyOverridden(propName) {
219
+ return this._overrideMaterialProps.has(propName);
220
+ }
221
+ set uniformValues(val) {
222
+ super.uniformValues = val;
223
+ }
224
+ get uniformValues() {
225
+ return super.uniformValues;
226
+ }
227
+ set uniformTextures(val) {
228
+ super.uniformTextures = val;
229
+ }
230
+ get uniformTextures() {
231
+ return super.uniformTextures;
232
+ }
233
+ setOverrides(uniformValues, uniformTextures) {
234
+ const parentValueMap = new Map((this._parentMaterial?.uniformValues ?? []).map((v)=>[
235
+ v.name,
236
+ v
237
+ ]));
238
+ const parentTextureMap = new Map((this._parentMaterial?.uniformTextures ?? []).map((v)=>[
239
+ v.name,
240
+ v
241
+ ]));
242
+ this._overrideUniformValues = new Map(cloneUniformValues(uniformValues).filter((v)=>{
243
+ const parent = parentValueMap.get(v.name);
244
+ return !parent || !uniformValueEquals(v, parent);
245
+ }).map((v)=>[
246
+ v.name,
247
+ v
248
+ ]));
249
+ this._overrideUniformTextures = new Map(cloneUniformTextures(uniformTextures).filter((v)=>{
250
+ const parent = parentTextureMap.get(v.name);
251
+ return !parent || !uniformTextureEquals(v, parent);
252
+ }).map((v)=>{
253
+ const parent = parentTextureMap.get(v.name);
254
+ return [
255
+ v.name,
256
+ parent ? inheritUniformTextureMetadata(parent, v) : v
257
+ ];
258
+ }));
259
+ this.syncInheritedUniforms();
260
+ }
261
+ getOverrideUniformValues() {
262
+ return [
263
+ ...this._overrideUniformValues.values()
264
+ ].map((v)=>({
265
+ name: v.name,
266
+ type: v.type,
267
+ value: [
268
+ ...v.value
269
+ ],
270
+ finalValue: undefined
271
+ }));
272
+ }
273
+ getOverrideUniformTextures() {
274
+ const parentTextureMap = new Map((this._parentMaterial?.uniformTextures ?? []).map((v)=>[
275
+ v.name,
276
+ v
277
+ ]));
278
+ return [
279
+ ...this._overrideUniformTextures.values()
280
+ ].map((v)=>{
281
+ const parent = parentTextureMap.get(v.name);
282
+ const normalized = parent ? inheritUniformTextureMetadata(parent, v) : v;
283
+ return {
284
+ ...normalized,
285
+ params: cloneTextureParams(normalized.params),
286
+ finalTexture: undefined,
287
+ finalSampler: undefined
288
+ };
289
+ });
290
+ }
291
+ getDiscardedOverridesForParent(parentMaterial) {
292
+ const parentValueMap = new Map(parentMaterial.uniformValues.map((v)=>[
293
+ v.name,
294
+ v
295
+ ]));
296
+ const parentTextureMap = new Map(parentMaterial.uniformTextures.map((v)=>[
297
+ v.name,
298
+ v
299
+ ]));
300
+ return {
301
+ uniformValues: [
302
+ ...this._overrideUniformValues.values()
303
+ ].filter((v)=>{
304
+ const parent = parentValueMap.get(v.name);
305
+ return !parent || parent.type !== v.type || parent.value.length !== v.value.length;
306
+ }).map((v)=>v.name),
307
+ uniformTextures: [
308
+ ...this._overrideUniformTextures.values()
309
+ ].filter((v)=>{
310
+ const parent = parentTextureMap.get(v.name);
311
+ return !parent || parent.type !== v.type || parent.exposed === false;
312
+ }).map((v)=>v.name)
313
+ };
314
+ }
315
+ changeParentMaterial(parentMaterial, parentMaterialId) {
316
+ const discarded = this.getDiscardedOverridesForParent(parentMaterial);
317
+ const discardedValues = new Set(discarded.uniformValues);
318
+ const discardedTextures = new Set(discarded.uniformTextures);
319
+ const parentTextureMap = new Map(parentMaterial.uniformTextures.map((v)=>[
320
+ v.name,
321
+ v
322
+ ]));
323
+ this._overrideUniformValues = new Map([
324
+ ...this._overrideUniformValues.entries()
325
+ ].filter(([name])=>!discardedValues.has(name)));
326
+ this._overrideUniformTextures = new Map([
327
+ ...this._overrideUniformTextures.entries()
328
+ ].filter(([name])=>!discardedTextures.has(name)).map(([name, override])=>{
329
+ const parent = parentTextureMap.get(name);
330
+ return [
331
+ name,
332
+ {
333
+ ...override,
334
+ exposed: parent.exposed,
335
+ inVertexShader: parent.inVertexShader,
336
+ inFragmentShader: parent.inFragmentShader
337
+ }
338
+ ];
339
+ }));
340
+ this.uniformTextures = this.uniformTextures.filter((v)=>!discardedTextures.has(v.name));
341
+ this.setParentMaterial(parentMaterial, parentMaterialId);
342
+ return discarded;
343
+ }
344
+ hasReflectionModeOverride() {
345
+ return this._reflectionModeOverridden;
346
+ }
347
+ setBlueprintInstanceReflectionMode(val, inherited = false) {
348
+ this._reflectionModeOverridden = !inherited && !!this._parentMaterial && val !== this._parentMaterial.reflectionMode;
349
+ super.reflectionMode = val;
350
+ }
351
+ copySubsurfaceProfile(source) {
352
+ if (!source) {
353
+ return null;
354
+ }
355
+ const profile = new SubsurfaceProfile();
356
+ profile.copyFrom(source);
357
+ return profile;
358
+ }
359
+ ensureSubsurfaceProfileOverride() {
360
+ if (this._subsurfaceProfileOverride) {
361
+ return this._subsurfaceProfileOverride;
362
+ }
363
+ const source = this.subsurfaceProfile ?? this._parentMaterial?.subsurfaceProfile ?? null;
364
+ const profile = this.copySubsurfaceProfile(source);
365
+ this._subsurfaceProfileOverride = profile;
366
+ super.subsurfaceProfile = profile;
367
+ return profile;
368
+ }
369
+ getInheritedSubsurfaceProfile() {
370
+ return this._parentMaterial?.subsurfaceProfile ?? null;
371
+ }
372
+ syncInheritedSubsurfaceProfile(parentProfile) {
373
+ if (this._subsurfaceProfileOverride) {
374
+ super.subsurfaceProfile = this._subsurfaceProfileOverride;
375
+ } else {
376
+ super.subsurfaceProfile = parentProfile ?? null;
377
+ }
378
+ }
379
+ setBlueprintInstanceSubsurfacePreset(val) {
380
+ this.setBlueprintInstanceSubsurfaceProfileValue('SubsurfaceLookPreset', 'preset', val);
381
+ }
382
+ setBlueprintInstanceSubsurfaceStrength(val) {
383
+ this.setBlueprintInstanceSubsurfaceProfileValue('SubsurfaceScatterWeight', 'strength', val);
384
+ }
385
+ setBlueprintInstanceSubsurfaceScale(val) {
386
+ this.setBlueprintInstanceSubsurfaceProfileValue('SubsurfaceScatterScale', 'scale', val);
387
+ }
388
+ setBlueprintInstanceSubsurfaceProfileValue(propName, key, value) {
389
+ const inherited = this.getInheritedSubsurfaceProfile();
390
+ const inheritedValue = inherited ? inherited[key] : undefined;
391
+ if (!this._subsurfaceProfileOverride && inherited && valuesEqual(inheritedValue, value)) {
392
+ this._overrideMaterialProps.delete(propName);
393
+ super.subsurfaceProfile = inherited;
394
+ return;
395
+ }
396
+ const profile = this.ensureSubsurfaceProfileOverride();
397
+ if (profile) {
398
+ this._overrideMaterialProps.add(propName);
399
+ profile[key] = value;
400
+ super.subsurfaceProfile = profile;
401
+ }
402
+ }
403
+ setParentMaterial(parentMaterial, parentMaterialId) {
404
+ this._parentMaterial = parentMaterial;
405
+ this._parentMaterialId = parentMaterialId ?? (parentMaterial ? getEngine().resourceManager.getAssetId(parentMaterial.coreMaterial) ?? '' : '');
406
+ if (parentMaterial) {
407
+ this.syncInheritedUniforms(parentMaterial);
408
+ // Keep the asset id on the instance asset, not the parent.
409
+ this.clearCache();
410
+ this.optionChanged(true);
411
+ }
412
+ }
413
+ syncInheritedUniforms(parentMaterial = this._parentMaterial) {
414
+ if (!parentMaterial) {
415
+ return;
416
+ }
417
+ const runtimeTextureMap = new Map((this.uniformTextures ?? []).map((v)=>[
418
+ v.name,
419
+ v
420
+ ]));
421
+ this.fragmentIR = parentMaterial.fragmentIR;
422
+ this.vertexIR = parentMaterial.vertexIR;
423
+ copyParentMaterialState(this, parentMaterial);
424
+ if (!this.isMaterialPropertyOverridden('Transmission')) {
425
+ this.transmission = parentMaterial.transmission;
426
+ }
427
+ if (!this.isMaterialPropertyOverridden('IOR')) {
428
+ this.ior = parentMaterial.ior;
429
+ }
430
+ if (!this.isMaterialPropertyOverridden('TransmissionFactor')) {
431
+ this.transmissionFactor = parentMaterial.transmissionFactor;
432
+ }
433
+ if (!this.isMaterialPropertyOverridden('ThicknessFactor')) {
434
+ this.thicknessFactor = parentMaterial.thicknessFactor;
435
+ }
436
+ if (!this.isMaterialPropertyOverridden('AttenuationColor')) {
437
+ this.attenuationColor = parentMaterial.attenuationColor;
438
+ }
439
+ if (!this.isMaterialPropertyOverridden('AttenuationDistance')) {
440
+ this.attenuationDistance = parentMaterial.attenuationDistance;
441
+ }
442
+ if (!this.isMaterialPropertyOverridden('TransmissionTexture')) {
443
+ this.transmissionTexture = parentMaterial.transmissionTexture;
444
+ }
445
+ if (!this.isMaterialPropertyOverridden('TransmissionTexCoordAddressU') && !this.isMaterialPropertyOverridden('TransmissionTexCoordAddressV')) {
446
+ this.transmissionTextureSampler = parentMaterial.transmissionTextureSampler;
447
+ }
448
+ if (!this.isMaterialPropertyOverridden('TransmissionTexCoordScale')) {
449
+ this.transmissionTexCoordMatrix = parentMaterial.transmissionTexCoordMatrix;
450
+ }
451
+ if (!this.isMaterialPropertyOverridden('TransmissionTexCoordIndex')) {
452
+ this.transmissionTexCoordIndex = parentMaterial.transmissionTexCoordIndex;
453
+ }
454
+ if (!this.isMaterialPropertyOverridden('ThicknessTexture')) {
455
+ this.thicknessTexture = parentMaterial.thicknessTexture;
456
+ }
457
+ if (!this.isMaterialPropertyOverridden('ThicknessTexCoordAddressU') && !this.isMaterialPropertyOverridden('ThicknessTexCoordAddressV')) {
458
+ this.thicknessTextureSampler = parentMaterial.thicknessTextureSampler;
459
+ }
460
+ if (!this.isMaterialPropertyOverridden('ThicknessTexCoordScale')) {
461
+ this.thicknessTexCoordMatrix = parentMaterial.thicknessTexCoordMatrix;
462
+ }
463
+ if (!this.isMaterialPropertyOverridden('ThicknessTexCoordIndex')) {
464
+ this.thicknessTexCoordIndex = parentMaterial.thicknessTexCoordIndex;
465
+ }
466
+ if (!this.isMaterialPropertyOverridden('SubsurfaceTexture')) {
467
+ this.subsurfaceTexture = parentMaterial.subsurfaceTexture;
468
+ }
469
+ if (!this.isMaterialPropertyOverridden('SubsurfaceTexCoordAddressU') && !this.isMaterialPropertyOverridden('SubsurfaceTexCoordAddressV')) {
470
+ this.subsurfaceTextureSampler = parentMaterial.subsurfaceTextureSampler;
471
+ }
472
+ if (!this.isMaterialPropertyOverridden('SubsurfaceTexCoordScale')) {
473
+ this.subsurfaceTexCoordMatrix = parentMaterial.subsurfaceTexCoordMatrix;
474
+ }
475
+ if (!this.isMaterialPropertyOverridden('SubsurfaceTexCoordIndex')) {
476
+ this.subsurfaceTexCoordIndex = parentMaterial.subsurfaceTexCoordIndex;
477
+ }
478
+ this.uniformValues = cloneUniformValues(parentMaterial.uniformValues).map((v)=>{
479
+ const override = this._overrideUniformValues.get(v.name);
480
+ return override ? {
481
+ ...v,
482
+ value: [
483
+ ...override.value
484
+ ],
485
+ finalValue: cloneUniformFinalValue(override)
486
+ } : v;
487
+ });
488
+ this.uniformTextures = cloneUniformTextures(parentMaterial.uniformTextures).map((v)=>{
489
+ const override = this._overrideUniformTextures.get(v.name);
490
+ return override ? mergeUniformTextureOverride(v, override, runtimeTextureMap.get(v.name) ?? null) : mergeHydratedUniformTexture(v, runtimeTextureMap.get(v.name) ?? null);
491
+ });
492
+ }
493
+ onDispose() {
494
+ this._subsurfaceProfileOverride?.dispose();
495
+ this._subsurfaceProfileOverride = null;
496
+ super.onDispose();
497
+ }
498
+ }
499
+
500
+ export { PBRBluePrintMaterialInstance };
501
+ //# sourceMappingURL=pbrblueprint_instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pbrblueprint_instance.js","sources":["../../src/material/pbrblueprint_instance.ts"],"sourcesContent":["import { DRef, Vector4, type Nullable } from '@zephyr3d/base';\r\nimport { getEngine } from '../app/api';\r\nimport type { BluePrintUniformTexture, BluePrintUniformValue } from '../utility/blueprint/material/ir';\r\nimport { PBRBluePrintMaterial } from './pbrblueprint';\r\nimport type { PBRReflectionMode } from './mixins/lightmodel/pbrmetallicroughness';\r\nimport { SubsurfaceProfile, type SubsurfaceProfilePreset } from './subsurfaceprofile';\r\n\r\nfunction cloneUniformFinalValue(value: BluePrintUniformValue) {\r\n if (typeof value.finalValue === 'number') {\r\n return value.finalValue;\r\n }\r\n if (value.finalValue instanceof Float32Array) {\r\n return new Float32Array(value.finalValue);\r\n }\r\n return value.value.length === 1 ? value.value[0] : new Float32Array(value.value);\r\n}\r\n\r\nfunction cloneTextureParams(params: BluePrintUniformTexture['params']) {\r\n return params instanceof Vector4\r\n ? params.clone()\r\n : params && typeof params === 'object' && 'x' in params && 'y' in params && 'z' in params && 'w' in params\r\n ? new Vector4(\r\n Number((params as { x: number }).x) || 0,\r\n Number((params as { y: number }).y) || 0,\r\n Number((params as { z: number }).z) || 0,\r\n Number((params as { w: number }).w) || 0\r\n )\r\n : Vector4.zero();\r\n}\r\n\r\nfunction cloneUniformValues(values: Nullable<BluePrintUniformValue[]>) {\r\n return (values ?? []).map((v) => ({\r\n ...v,\r\n value: [...v.value],\r\n finalValue: cloneUniformFinalValue(v)\r\n }));\r\n}\r\n\r\nfunction cloneUniformTextures(values: Nullable<BluePrintUniformTexture[]>) {\r\n return (values ?? []).map((v) => ({\r\n ...v,\r\n exposed: v.exposed ?? true,\r\n params: cloneTextureParams(v.params),\r\n finalTexture: v.finalTexture ? new DRef(v.finalTexture.get()) : undefined,\r\n finalSampler: v.finalSampler\r\n }));\r\n}\r\n\r\nfunction mergeHydratedUniformTexture(\r\n base: BluePrintUniformTexture,\r\n runtime: Nullable<BluePrintUniformTexture>\r\n) {\r\n if (!runtime) {\r\n return base;\r\n }\r\n return {\r\n ...base,\r\n finalTexture: runtime.finalTexture ?? base.finalTexture,\r\n finalSampler: runtime.finalSampler ?? base.finalSampler,\r\n params: runtime.params ?? base.params\r\n };\r\n}\r\n\r\nfunction inheritUniformTextureMetadata(parent: BluePrintUniformTexture, override: BluePrintUniformTexture) {\r\n return {\r\n ...override,\r\n type: parent.type,\r\n exposed: parent.exposed,\r\n sRGB: parent.sRGB,\r\n wrapS: parent.wrapS,\r\n wrapT: parent.wrapT,\r\n minFilter: parent.minFilter,\r\n magFilter: parent.magFilter,\r\n mipFilter: parent.mipFilter,\r\n inVertexShader: parent.inVertexShader,\r\n inFragmentShader: parent.inFragmentShader,\r\n finalSampler: parent.finalSampler\r\n };\r\n}\r\n\r\nfunction mergeUniformTextureOverride(\r\n parent: BluePrintUniformTexture,\r\n override: BluePrintUniformTexture,\r\n runtime: Nullable<BluePrintUniformTexture>\r\n) {\r\n const hydratedOverride = override.finalTexture\r\n ? override\r\n : runtime?.texture === override.texture\r\n ? runtime\r\n : null;\r\n return inheritUniformTextureMetadata(parent, {\r\n ...override,\r\n finalTexture: hydratedOverride?.finalTexture ?? parent.finalTexture,\r\n params: hydratedOverride?.params ?? parent.params\r\n });\r\n}\r\n\r\nfunction uniformValueEquals(a: BluePrintUniformValue, b: BluePrintUniformValue) {\r\n if (a.type !== b.type || a.value.length !== b.value.length) {\r\n return false;\r\n }\r\n for (let i = 0; i < a.value.length; i++) {\r\n if (a.value[i] !== b.value[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nfunction uniformTextureEquals(a: BluePrintUniformTexture, b: BluePrintUniformTexture) {\r\n return a.type === b.type && a.texture === b.texture;\r\n}\r\n\r\nfunction valuesEqual(a: unknown, b: unknown) {\r\n if (a === b) {\r\n return true;\r\n }\r\n if (\r\n a &&\r\n b &&\r\n typeof a === 'object' &&\r\n typeof b === 'object' &&\r\n 'equalsTo' in (a as Record<string, unknown>) &&\r\n typeof (a as { equalsTo?: unknown }).equalsTo === 'function'\r\n ) {\r\n return !!(a as { equalsTo: (other: unknown) => boolean }).equalsTo(b);\r\n }\r\n return false;\r\n}\r\n\r\n/** Parameter overrides that cannot be migrated to a new blueprint material parent. */\r\nexport interface PBRBluePrintMaterialInstanceDiscardedOverrides {\r\n uniformValues: string[];\r\n uniformTextures: string[];\r\n}\r\n\r\nfunction copyParentMaterialState(\r\n instance: PBRBluePrintMaterialInstance,\r\n parentMaterial: PBRBluePrintMaterial\r\n) {\r\n instance.alphaCutoff = parentMaterial.alphaCutoff;\r\n instance.alphaDither = parentMaterial.alphaDither;\r\n instance.alphaToCoverage = parentMaterial.alphaToCoverage;\r\n instance.blendMode = parentMaterial.blendMode;\r\n instance.transparentShadowCaster = parentMaterial.transparentShadowCaster;\r\n instance.shadowAlphaCutoff = parentMaterial.shadowAlphaCutoff;\r\n instance.cullMode = parentMaterial.cullMode;\r\n instance.opacity = parentMaterial.opacity;\r\n instance.objectColor = parentMaterial.objectColor;\r\n instance.TAAStrength = parentMaterial.TAAStrength;\r\n if (!instance.isMaterialPropertyOverridden('NormalScale')) {\r\n instance.normalScale = parentMaterial.normalScale;\r\n }\r\n if (!instance.isMaterialPropertyOverridden('NormalFlipY')) {\r\n instance.normalFlipY = parentMaterial.normalFlipY;\r\n }\r\n if (!instance.isMaterialPropertyOverridden('doubleSidedLighting')) {\r\n instance.doubleSidedLighting = parentMaterial.doubleSidedLighting;\r\n }\r\n if (!instance.isMaterialPropertyOverridden('RectSpecularScale')) {\r\n instance.rectSpecularScale = parentMaterial.rectSpecularScale;\r\n }\r\n instance.clearcoat = parentMaterial.clearcoat;\r\n instance.clearcoatIntensity = parentMaterial.clearcoatIntensity;\r\n instance.clearcoatRoughnessFactor = parentMaterial.clearcoatRoughnessFactor;\r\n instance.clearcoatIntensityTexture = parentMaterial.clearcoatIntensityTexture;\r\n instance.clearcoatIntensityTextureSampler = parentMaterial.clearcoatIntensityTextureSampler;\r\n instance.clearcoatIntensityTexCoordMatrix = parentMaterial.clearcoatIntensityTexCoordMatrix;\r\n instance.clearcoatIntensityTexCoordIndex = parentMaterial.clearcoatIntensityTexCoordIndex;\r\n instance.clearcoatRoughnessTexture = parentMaterial.clearcoatRoughnessTexture;\r\n instance.clearcoatRoughnessTextureSampler = parentMaterial.clearcoatRoughnessTextureSampler;\r\n instance.clearcoatRoughnessTexCoordMatrix = parentMaterial.clearcoatRoughnessTexCoordMatrix;\r\n instance.clearcoatRoughnessTexCoordIndex = parentMaterial.clearcoatRoughnessTexCoordIndex;\r\n instance.clearcoatNormalTexture = parentMaterial.clearcoatNormalTexture;\r\n instance.clearcoatNormalTextureSampler = parentMaterial.clearcoatNormalTextureSampler;\r\n instance.clearcoatNormalTexCoordMatrix = parentMaterial.clearcoatNormalTexCoordMatrix;\r\n instance.clearcoatNormalTexCoordIndex = parentMaterial.clearcoatNormalTexCoordIndex;\r\n instance.syncInheritedSubsurfaceProfile(parentMaterial.subsurfaceProfile);\r\n if (!instance.hasReflectionModeOverride()) {\r\n instance.setBlueprintInstanceReflectionMode(parentMaterial.reflectionMode, true);\r\n }\r\n}\r\n\r\n/**\r\n * Blueprint material instance asset.\r\n *\r\n * Inherits graph/IR from a parent blueprint material and only stores parameter overrides.\r\n * Instances are asset-level indirections, distinct from MeshMaterial runtime instancing.\r\n *\r\n * @public\r\n */\r\nexport class PBRBluePrintMaterialInstance extends PBRBluePrintMaterial {\r\n private _parentMaterialId: string;\r\n private _parentMaterial: Nullable<PBRBluePrintMaterial>;\r\n private _overrideUniformValues: Map<string, BluePrintUniformValue>;\r\n private _overrideUniformTextures: Map<string, BluePrintUniformTexture>;\r\n private _reflectionModeOverridden: boolean;\r\n private _overrideMaterialProps: Set<string>;\r\n private _subsurfaceProfileOverride: SubsurfaceProfile | null;\r\n\r\n constructor(parentMaterial?: Nullable<PBRBluePrintMaterial>, parentMaterialId = '') {\r\n super();\r\n this._parentMaterialId = parentMaterialId;\r\n this._parentMaterial = null;\r\n this._overrideUniformValues = new Map();\r\n this._overrideUniformTextures = new Map();\r\n this._reflectionModeOverridden = false;\r\n this._overrideMaterialProps = new Set();\r\n this._subsurfaceProfileOverride = null;\r\n if (parentMaterial) {\r\n this.setParentMaterial(parentMaterial, parentMaterialId);\r\n }\r\n }\r\n\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n if (other instanceof PBRBluePrintMaterialInstance) {\r\n const overrideUniformValues = cloneUniformValues([...other._overrideUniformValues.values()]);\r\n const overrideUniformTextures = cloneUniformTextures([...other._overrideUniformTextures.values()]);\r\n const subsurfaceProfileOverride = this.copySubsurfaceProfile(other._subsurfaceProfileOverride);\r\n for (const uniform of this._overrideUniformTextures.values()) {\r\n uniform.finalTexture?.dispose();\r\n }\r\n this._parentMaterial = other._parentMaterial;\r\n this._parentMaterialId = other._parentMaterialId;\r\n this._overrideUniformValues = new Map(overrideUniformValues.map((uniform) => [uniform.name, uniform]));\r\n this._overrideUniformTextures = new Map(\r\n overrideUniformTextures.map((uniform) => [uniform.name, uniform])\r\n );\r\n this._reflectionModeOverridden = other._reflectionModeOverridden;\r\n this._overrideMaterialProps = new Set(other._overrideMaterialProps);\r\n this._subsurfaceProfileOverride?.dispose();\r\n this._subsurfaceProfileOverride = subsurfaceProfileOverride;\r\n this.syncInheritedUniforms();\r\n }\r\n }\r\n\r\n get parentMaterialId() {\r\n return this._parentMaterialId;\r\n }\r\n\r\n get parentMaterial() {\r\n return this._parentMaterial;\r\n }\r\n\r\n get isBlueprintMaterialInstance() {\r\n return true;\r\n }\r\n\r\n get hasSubsurfaceProfileOverride() {\r\n return !!this._subsurfaceProfileOverride;\r\n }\r\n\r\n setMaterialPropertyOverrides(propNames: Iterable<string>) {\r\n this._overrideMaterialProps = new Set(propNames);\r\n }\r\n\r\n getMaterialPropertyOverrides() {\r\n return [...this._overrideMaterialProps];\r\n }\r\n\r\n markMaterialPropertyOverridden(propName: string) {\r\n this._overrideMaterialProps.add(propName);\r\n }\r\n\r\n isMaterialPropertyOverridden(propName: string) {\r\n return this._overrideMaterialProps.has(propName);\r\n }\r\n\r\n set uniformValues(val: BluePrintUniformValue[]) {\r\n super.uniformValues = val;\r\n }\r\n\r\n get uniformValues() {\r\n return super.uniformValues;\r\n }\r\n\r\n set uniformTextures(val: BluePrintUniformTexture[]) {\r\n super.uniformTextures = val;\r\n }\r\n\r\n get uniformTextures() {\r\n return super.uniformTextures;\r\n }\r\n\r\n setOverrides(\r\n uniformValues: Nullable<BluePrintUniformValue[]>,\r\n uniformTextures: Nullable<BluePrintUniformTexture[]>\r\n ) {\r\n const parentValueMap = new Map((this._parentMaterial?.uniformValues ?? []).map((v) => [v.name, v]));\r\n const parentTextureMap = new Map((this._parentMaterial?.uniformTextures ?? []).map((v) => [v.name, v]));\r\n this._overrideUniformValues = new Map(\r\n cloneUniformValues(uniformValues)\r\n .filter((v) => {\r\n const parent = parentValueMap.get(v.name);\r\n return !parent || !uniformValueEquals(v, parent);\r\n })\r\n .map((v) => [v.name, v])\r\n );\r\n this._overrideUniformTextures = new Map(\r\n cloneUniformTextures(uniformTextures)\r\n .filter((v) => {\r\n const parent = parentTextureMap.get(v.name);\r\n return !parent || !uniformTextureEquals(v, parent);\r\n })\r\n .map((v) => {\r\n const parent = parentTextureMap.get(v.name);\r\n return [v.name, parent ? inheritUniformTextureMetadata(parent, v) : v] as const;\r\n })\r\n );\r\n this.syncInheritedUniforms();\r\n }\r\n\r\n getOverrideUniformValues() {\r\n return [...this._overrideUniformValues.values()].map((v) => ({\r\n name: v.name,\r\n type: v.type,\r\n value: [...v.value],\r\n finalValue: undefined\r\n }));\r\n }\r\n\r\n getOverrideUniformTextures() {\r\n const parentTextureMap = new Map((this._parentMaterial?.uniformTextures ?? []).map((v) => [v.name, v]));\r\n return [...this._overrideUniformTextures.values()].map((v) => {\r\n const parent = parentTextureMap.get(v.name);\r\n const normalized = parent ? inheritUniformTextureMetadata(parent, v) : v;\r\n return {\r\n ...normalized,\r\n params: cloneTextureParams(normalized.params),\r\n finalTexture: undefined,\r\n finalSampler: undefined\r\n };\r\n });\r\n }\r\n\r\n getDiscardedOverridesForParent(\r\n parentMaterial: PBRBluePrintMaterial\r\n ): PBRBluePrintMaterialInstanceDiscardedOverrides {\r\n const parentValueMap = new Map(parentMaterial.uniformValues.map((v) => [v.name, v]));\r\n const parentTextureMap = new Map(parentMaterial.uniformTextures.map((v) => [v.name, v]));\r\n return {\r\n uniformValues: [...this._overrideUniformValues.values()]\r\n .filter((v) => {\r\n const parent = parentValueMap.get(v.name);\r\n return !parent || parent.type !== v.type || parent.value.length !== v.value.length;\r\n })\r\n .map((v) => v.name),\r\n uniformTextures: [...this._overrideUniformTextures.values()]\r\n .filter((v) => {\r\n const parent = parentTextureMap.get(v.name);\r\n return !parent || parent.type !== v.type || parent.exposed === false;\r\n })\r\n .map((v) => v.name)\r\n };\r\n }\r\n\r\n changeParentMaterial(\r\n parentMaterial: PBRBluePrintMaterial,\r\n parentMaterialId?: string\r\n ): PBRBluePrintMaterialInstanceDiscardedOverrides {\r\n const discarded = this.getDiscardedOverridesForParent(parentMaterial);\r\n const discardedValues = new Set(discarded.uniformValues);\r\n const discardedTextures = new Set(discarded.uniformTextures);\r\n const parentTextureMap = new Map(parentMaterial.uniformTextures.map((v) => [v.name, v]));\r\n\r\n this._overrideUniformValues = new Map(\r\n [...this._overrideUniformValues.entries()].filter(([name]) => !discardedValues.has(name))\r\n );\r\n this._overrideUniformTextures = new Map(\r\n [...this._overrideUniformTextures.entries()]\r\n .filter(([name]) => !discardedTextures.has(name))\r\n .map(([name, override]) => {\r\n const parent = parentTextureMap.get(name)!;\r\n return [\r\n name,\r\n {\r\n ...override,\r\n exposed: parent.exposed,\r\n inVertexShader: parent.inVertexShader,\r\n inFragmentShader: parent.inFragmentShader\r\n }\r\n ];\r\n })\r\n );\r\n this.uniformTextures = this.uniformTextures.filter((v) => !discardedTextures.has(v.name));\r\n this.setParentMaterial(parentMaterial, parentMaterialId);\r\n return discarded;\r\n }\r\n\r\n hasReflectionModeOverride() {\r\n return this._reflectionModeOverridden;\r\n }\r\n\r\n setBlueprintInstanceReflectionMode(val: PBRReflectionMode, inherited = false) {\r\n this._reflectionModeOverridden =\r\n !inherited && !!this._parentMaterial && val !== this._parentMaterial.reflectionMode;\r\n super.reflectionMode = val;\r\n }\r\n\r\n private copySubsurfaceProfile(source: Nullable<SubsurfaceProfile>) {\r\n if (!source) {\r\n return null;\r\n }\r\n const profile = new SubsurfaceProfile();\r\n profile.copyFrom(source);\r\n return profile;\r\n }\r\n\r\n private ensureSubsurfaceProfileOverride() {\r\n if (this._subsurfaceProfileOverride) {\r\n return this._subsurfaceProfileOverride;\r\n }\r\n const source = this.subsurfaceProfile ?? this._parentMaterial?.subsurfaceProfile ?? null;\r\n const profile = this.copySubsurfaceProfile(source);\r\n this._subsurfaceProfileOverride = profile;\r\n super.subsurfaceProfile = profile;\r\n return profile;\r\n }\r\n\r\n private getInheritedSubsurfaceProfile() {\r\n return this._parentMaterial?.subsurfaceProfile ?? null;\r\n }\r\n\r\n syncInheritedSubsurfaceProfile(parentProfile: Nullable<SubsurfaceProfile>) {\r\n if (this._subsurfaceProfileOverride) {\r\n super.subsurfaceProfile = this._subsurfaceProfileOverride;\r\n } else {\r\n super.subsurfaceProfile = parentProfile ?? null;\r\n }\r\n }\r\n\r\n setBlueprintInstanceSubsurfacePreset(val: SubsurfaceProfilePreset) {\r\n this.setBlueprintInstanceSubsurfaceProfileValue('SubsurfaceLookPreset', 'preset', val);\r\n }\r\n\r\n setBlueprintInstanceSubsurfaceStrength(val: number) {\r\n this.setBlueprintInstanceSubsurfaceProfileValue('SubsurfaceScatterWeight', 'strength', val);\r\n }\r\n\r\n setBlueprintInstanceSubsurfaceScale(val: number) {\r\n this.setBlueprintInstanceSubsurfaceProfileValue('SubsurfaceScatterScale', 'scale', val);\r\n }\r\n\r\n setBlueprintInstanceSubsurfaceProfileValue<K extends keyof SubsurfaceProfile>(\r\n propName: string,\r\n key: K,\r\n value: SubsurfaceProfile[K]\r\n ) {\r\n const inherited = this.getInheritedSubsurfaceProfile();\r\n const inheritedValue = inherited ? inherited[key] : undefined;\r\n if (!this._subsurfaceProfileOverride && inherited && valuesEqual(inheritedValue, value)) {\r\n this._overrideMaterialProps.delete(propName);\r\n super.subsurfaceProfile = inherited;\r\n return;\r\n }\r\n const profile = this.ensureSubsurfaceProfileOverride();\r\n if (profile) {\r\n this._overrideMaterialProps.add(propName);\r\n (profile as unknown as Record<string, unknown>)[key as string] = value;\r\n super.subsurfaceProfile = profile;\r\n }\r\n }\r\n\r\n setParentMaterial(parentMaterial: Nullable<PBRBluePrintMaterial>, parentMaterialId?: string) {\r\n this._parentMaterial = parentMaterial;\r\n this._parentMaterialId =\r\n parentMaterialId ??\r\n (parentMaterial ? (getEngine().resourceManager.getAssetId(parentMaterial.coreMaterial) ?? '') : '');\r\n if (parentMaterial) {\r\n this.syncInheritedUniforms(parentMaterial);\r\n // Keep the asset id on the instance asset, not the parent.\r\n this.clearCache();\r\n this.optionChanged(true);\r\n }\r\n }\r\n\r\n syncInheritedUniforms(parentMaterial = this._parentMaterial) {\r\n if (!parentMaterial) {\r\n return;\r\n }\r\n const runtimeTextureMap = new Map((this.uniformTextures ?? []).map((v) => [v.name, v]));\r\n this.fragmentIR = parentMaterial.fragmentIR;\r\n this.vertexIR = parentMaterial.vertexIR;\r\n copyParentMaterialState(this, parentMaterial);\r\n if (!this.isMaterialPropertyOverridden('Transmission')) {\r\n this.transmission = parentMaterial.transmission;\r\n }\r\n if (!this.isMaterialPropertyOverridden('IOR')) {\r\n this.ior = parentMaterial.ior;\r\n }\r\n if (!this.isMaterialPropertyOverridden('TransmissionFactor')) {\r\n this.transmissionFactor = parentMaterial.transmissionFactor;\r\n }\r\n if (!this.isMaterialPropertyOverridden('ThicknessFactor')) {\r\n this.thicknessFactor = parentMaterial.thicknessFactor;\r\n }\r\n if (!this.isMaterialPropertyOverridden('AttenuationColor')) {\r\n this.attenuationColor = parentMaterial.attenuationColor;\r\n }\r\n if (!this.isMaterialPropertyOverridden('AttenuationDistance')) {\r\n this.attenuationDistance = parentMaterial.attenuationDistance;\r\n }\r\n if (!this.isMaterialPropertyOverridden('TransmissionTexture')) {\r\n this.transmissionTexture = parentMaterial.transmissionTexture;\r\n }\r\n if (\r\n !this.isMaterialPropertyOverridden('TransmissionTexCoordAddressU') &&\r\n !this.isMaterialPropertyOverridden('TransmissionTexCoordAddressV')\r\n ) {\r\n this.transmissionTextureSampler = parentMaterial.transmissionTextureSampler;\r\n }\r\n if (!this.isMaterialPropertyOverridden('TransmissionTexCoordScale')) {\r\n this.transmissionTexCoordMatrix = parentMaterial.transmissionTexCoordMatrix;\r\n }\r\n if (!this.isMaterialPropertyOverridden('TransmissionTexCoordIndex')) {\r\n this.transmissionTexCoordIndex = parentMaterial.transmissionTexCoordIndex;\r\n }\r\n if (!this.isMaterialPropertyOverridden('ThicknessTexture')) {\r\n this.thicknessTexture = parentMaterial.thicknessTexture;\r\n }\r\n if (\r\n !this.isMaterialPropertyOverridden('ThicknessTexCoordAddressU') &&\r\n !this.isMaterialPropertyOverridden('ThicknessTexCoordAddressV')\r\n ) {\r\n this.thicknessTextureSampler = parentMaterial.thicknessTextureSampler;\r\n }\r\n if (!this.isMaterialPropertyOverridden('ThicknessTexCoordScale')) {\r\n this.thicknessTexCoordMatrix = parentMaterial.thicknessTexCoordMatrix;\r\n }\r\n if (!this.isMaterialPropertyOverridden('ThicknessTexCoordIndex')) {\r\n this.thicknessTexCoordIndex = parentMaterial.thicknessTexCoordIndex;\r\n }\r\n if (!this.isMaterialPropertyOverridden('SubsurfaceTexture')) {\r\n this.subsurfaceTexture = parentMaterial.subsurfaceTexture;\r\n }\r\n if (\r\n !this.isMaterialPropertyOverridden('SubsurfaceTexCoordAddressU') &&\r\n !this.isMaterialPropertyOverridden('SubsurfaceTexCoordAddressV')\r\n ) {\r\n this.subsurfaceTextureSampler = parentMaterial.subsurfaceTextureSampler;\r\n }\r\n if (!this.isMaterialPropertyOverridden('SubsurfaceTexCoordScale')) {\r\n this.subsurfaceTexCoordMatrix = parentMaterial.subsurfaceTexCoordMatrix;\r\n }\r\n if (!this.isMaterialPropertyOverridden('SubsurfaceTexCoordIndex')) {\r\n this.subsurfaceTexCoordIndex = parentMaterial.subsurfaceTexCoordIndex;\r\n }\r\n this.uniformValues = cloneUniformValues(parentMaterial.uniformValues).map((v) => {\r\n const override = this._overrideUniformValues.get(v.name);\r\n return override\r\n ? {\r\n ...v,\r\n value: [...override.value],\r\n finalValue: cloneUniformFinalValue(override)\r\n }\r\n : v;\r\n });\r\n this.uniformTextures = cloneUniformTextures(parentMaterial.uniformTextures).map((v) => {\r\n const override = this._overrideUniformTextures.get(v.name);\r\n return override\r\n ? mergeUniformTextureOverride(v, override, runtimeTextureMap.get(v.name) ?? null)\r\n : mergeHydratedUniformTexture(v, runtimeTextureMap.get(v.name) ?? null);\r\n });\r\n }\r\n\r\n protected override onDispose() {\r\n this._subsurfaceProfileOverride?.dispose();\r\n this._subsurfaceProfileOverride = null;\r\n super.onDispose();\r\n }\r\n}\r\n"],"names":["cloneUniformFinalValue","value","finalValue","Float32Array","length","cloneTextureParams","params","Vector4","clone","Number","x","y","z","w","zero","cloneUniformValues","values","map","v","cloneUniformTextures","exposed","finalTexture","DRef","get","undefined","finalSampler","mergeHydratedUniformTexture","base","runtime","inheritUniformTextureMetadata","parent","override","type","sRGB","wrapS","wrapT","minFilter","magFilter","mipFilter","inVertexShader","inFragmentShader","mergeUniformTextureOverride","hydratedOverride","texture","uniformValueEquals","a","b","i","uniformTextureEquals","valuesEqual","equalsTo","copyParentMaterialState","instance","parentMaterial","alphaCutoff","alphaDither","alphaToCoverage","blendMode","transparentShadowCaster","shadowAlphaCutoff","cullMode","opacity","objectColor","TAAStrength","isMaterialPropertyOverridden","normalScale","normalFlipY","doubleSidedLighting","rectSpecularScale","clearcoat","clearcoatIntensity","clearcoatRoughnessFactor","clearcoatIntensityTexture","clearcoatIntensityTextureSampler","clearcoatIntensityTexCoordMatrix","clearcoatIntensityTexCoordIndex","clearcoatRoughnessTexture","clearcoatRoughnessTextureSampler","clearcoatRoughnessTexCoordMatrix","clearcoatRoughnessTexCoordIndex","clearcoatNormalTexture","clearcoatNormalTextureSampler","clearcoatNormalTexCoordMatrix","clearcoatNormalTexCoordIndex","syncInheritedSubsurfaceProfile","subsurfaceProfile","hasReflectionModeOverride","setBlueprintInstanceReflectionMode","reflectionMode","PBRBluePrintMaterialInstance","PBRBluePrintMaterial","_parentMaterialId","_parentMaterial","_overrideUniformValues","_overrideUniformTextures","_reflectionModeOverridden","_overrideMaterialProps","_subsurfaceProfileOverride","parentMaterialId","Map","Set","setParentMaterial","copyFrom","other","overrideUniformValues","overrideUniformTextures","subsurfaceProfileOverride","copySubsurfaceProfile","uniform","dispose","name","syncInheritedUniforms","isBlueprintMaterialInstance","hasSubsurfaceProfileOverride","setMaterialPropertyOverrides","propNames","getMaterialPropertyOverrides","markMaterialPropertyOverridden","propName","add","has","uniformValues","val","uniformTextures","setOverrides","parentValueMap","parentTextureMap","filter","getOverrideUniformValues","getOverrideUniformTextures","normalized","getDiscardedOverridesForParent","changeParentMaterial","discarded","discardedValues","discardedTextures","entries","inherited","source","profile","SubsurfaceProfile","ensureSubsurfaceProfileOverride","getInheritedSubsurfaceProfile","parentProfile","setBlueprintInstanceSubsurfacePreset","setBlueprintInstanceSubsurfaceProfileValue","setBlueprintInstanceSubsurfaceStrength","setBlueprintInstanceSubsurfaceScale","key","inheritedValue","delete","getEngine","resourceManager","getAssetId","coreMaterial","clearCache","optionChanged","runtimeTextureMap","fragmentIR","vertexIR","transmission","ior","transmissionFactor","thicknessFactor","attenuationColor","attenuationDistance","transmissionTexture","transmissionTextureSampler","transmissionTexCoordMatrix","transmissionTexCoordIndex","thicknessTexture","thicknessTextureSampler","thicknessTexCoordMatrix","thicknessTexCoordIndex","subsurfaceTexture","subsurfaceTextureSampler","subsurfaceTexCoordMatrix","subsurfaceTexCoordIndex","onDispose"],"mappings":"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"}
@@ -190,33 +190,32 @@ import { Vector3 } from '@zephyr3d/base';
190
190
  const hasExplicitTransmissionAuthoring = !!(this.transmissionTexture || this.thicknessTexture);
191
191
  scope.$l.sssMask = pb.float(1);
192
192
  scope.$l.sssScatterSoftness = pb.float(0);
193
- scope.$l.sssTransmissionMask = pb.float(0);
194
- scope.$l.sssTransmissionAuthor = pb.float(1);
195
- scope.$l.sssThicknessScale = pb.clamp(pb.div(scope.zThicknessFactor ?? 0, pb.add(scope.zThicknessFactor ?? 0, 1)), 0, 1);
196
- scope.$l.sssThinAuthorMask = pb.sub(1, scope.sssThicknessScale);
193
+ // Negative alpha marks profiles that need conservative screen-space thin-region inference.
194
+ scope.$l.sssTransmissionMask = pb.float(hasExplicitTransmissionAuthoring ? 0 : -1);
197
195
  if (this.subsurfaceTexture) {
198
196
  scope.$l.sssTexel = this.sampleSubsurfaceTexture(scope);
199
197
  scope.sssMask = pb.clamp(scope.sssTexel.r, 0, 1);
200
198
  scope.sssScatterSoftness = pb.clamp(scope.sssTexel.g, 0, 1);
201
199
  }
202
- if (this.transmissionTexture) {
203
- scope.sssTransmissionAuthor = pb.mul(scope.sssTransmissionAuthor, pb.clamp(this.sampleTransmissionTexture(scope).r, 0, 1));
204
- }
205
- if (this.thicknessTexture) {
206
- scope.$l.sssThicknessSample = pb.clamp(this.sampleThicknessTexture(scope).g, 0, 1);
207
- scope.sssThinAuthorMask = pb.clamp(pb.mix(pb.sub(1, scope.sssThicknessSample), pb.sub(1, pb.mul(scope.sssThicknessSample, scope.sssThicknessScale)), pb.add(0.35, pb.mul(scope.sssThicknessScale, 0.65))), 0, 1);
200
+ if (hasExplicitTransmissionAuthoring) {
201
+ scope.$l.sssTransmissionAuthor = pb.float(this.thicknessTexture ? 1 : 0);
202
+ if (this.transmissionTexture) {
203
+ scope.sssTransmissionAuthor = pb.clamp(pb.mul(this.sampleTransmissionTexture(scope).r, scope.zTransmissionFactor ?? 0), 0, 1);
204
+ }
205
+ scope.$l.sssThinAuthorMask = pb.float(this.transmissionTexture ? 1 : 0);
206
+ if (this.thicknessTexture) {
207
+ // KHR_materials_volume stores thickness in G: zero is thin and one is thick.
208
+ scope.$l.sssThicknessSample = pb.clamp(this.sampleThicknessTexture(scope).g, 0, 1);
209
+ scope.sssThinAuthorMask = pb.sub(1, scope.sssThicknessSample);
210
+ }
211
+ scope.$l.sssAuthoredTransmissionMask = pb.clamp(pb.mul(scope.sssTransmissionAuthor, scope.sssThinAuthorMask), 0, 1);
212
+ scope.sssTransmissionMask = scope.sssAuthoredTransmissionMask;
208
213
  }
209
- scope.$l.sssAuthoredTransmissionMask = pb.clamp(pb.mul(scope.sssTransmissionAuthor, scope.sssThinAuthorMask), 0, 1);
210
- scope.sssTransmissionMask = pb.clamp(pb.max(scope.sssTransmissionMask, scope.sssAuthoredTransmissionMask), 0, 1);
211
214
  scope.$l.sssScatterStrengthMask = pb.clamp(pb.add(pb.mul(scope.sssMask, 0.82), pb.mul(scope.sssScatterSoftness, 0.38)), 0, 1);
212
215
  scope.$l.sssScatterWidthMask = pb.clamp(pb.max(scope.sssMask, pb.mul(scope.sssScatterSoftness, 0.9)), 0, 1);
213
216
  scope.$l.sssStrength = pb.mul(this.getSubsurfaceProfileStrength(scope), scope.sssScatterStrengthMask);
214
217
  scope.$l.sssWidthBase = pb.mul(this.getSubsurfaceProfileScale(scope), scope.sssScatterWidthMask);
215
218
  scope.$l.sssWidth = pb.clamp(pb.div(scope.sssWidthBase, pb.add(scope.sssWidthBase, 1)), 0, 0.999);
216
- if (!hasExplicitTransmissionAuthoring) {
217
- scope.$l.sssProfileFallbackMask = pb.clamp(pb.add(pb.mul(scope.sssMask, 0.12), pb.add(pb.mul(scope.sssStrength, 0.18), pb.mul(scope.sssWidth, 0.24))), 0, 0.42);
218
- scope.sssTransmissionMask = pb.max(scope.sssTransmissionMask, scope.sssProfileFallbackMask);
219
- }
220
219
  scope.$l.sssSlotEncoded = pb.div(this.getSubsurfaceProfileId(scope), 255);
221
220
  scope.$l.sssPresetEncoded = pb.div(this.getSubsurfaceProfilePreset(scope), 255);
222
221
  scope.$l.sssParams = pb.vec4(scope.sssSlotEncoded, scope.sssWidth, scope.sssPresetEncoded, pb.add(0.75, pb.mul(scope.sssScatterSoftness, 0.25)));