@zephyr3d/scene 0.5.0 → 0.6.0

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 (198) hide show
  1. package/dist/animation/animationset.js +37 -37
  2. package/dist/animation/morphtrack.js +7 -5
  3. package/dist/animation/morphtrack.js.map +1 -1
  4. package/dist/animation/skeleton.js +11 -9
  5. package/dist/animation/skeleton.js.map +1 -1
  6. package/dist/asset/assetmanager.js +2 -2
  7. package/dist/asset/loaders/gltf/gltf_loader.js +7 -3
  8. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  9. package/dist/asset/loaders/image/webimage_loader.js +16 -0
  10. package/dist/asset/loaders/image/webimage_loader.js.map +1 -1
  11. package/dist/asset/model.js +3 -9
  12. package/dist/asset/model.js.map +1 -1
  13. package/dist/blitter/bilateralblur.js +222 -0
  14. package/dist/{render/temporalcache.js.map → blitter/bilateralblur.js.map} +1 -1
  15. package/dist/blitter/blitter.js +7 -1
  16. package/dist/blitter/blitter.js.map +1 -1
  17. package/dist/blitter/depthlimitedgaussion.js +96 -39
  18. package/dist/blitter/depthlimitedgaussion.js.map +1 -1
  19. package/dist/blitter/gaussianblur.js +21 -21
  20. package/dist/camera/camera.js +142 -1
  21. package/dist/camera/camera.js.map +1 -1
  22. package/dist/index.d.ts +1178 -745
  23. package/dist/index.js +11 -6
  24. package/dist/index.js.map +1 -1
  25. package/dist/material/blinn.js +9 -3
  26. package/dist/material/blinn.js.map +1 -1
  27. package/dist/material/lambert.js +6 -2
  28. package/dist/material/lambert.js.map +1 -1
  29. package/dist/material/material.js +3 -1
  30. package/dist/material/material.js.map +1 -1
  31. package/dist/material/meshmaterial.js +73 -33
  32. package/dist/material/meshmaterial.js.map +1 -1
  33. package/dist/material/mixins/albedocolor.js +5 -4
  34. package/dist/material/mixins/albedocolor.js.map +1 -1
  35. package/dist/material/mixins/lightmodel/blinnphong.js +17 -7
  36. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  37. package/dist/material/mixins/lightmodel/lambert.js +5 -5
  38. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +13 -4
  39. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  40. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +13 -4
  41. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  42. package/dist/material/mixins/pbr/common.js +27 -15
  43. package/dist/material/mixins/pbr/common.js.map +1 -1
  44. package/dist/material/pbrmr.js +14 -3
  45. package/dist/material/pbrmr.js.map +1 -1
  46. package/dist/material/pbrsg.js +14 -3
  47. package/dist/material/pbrsg.js.map +1 -1
  48. package/dist/material/shader/helper.js +36 -21
  49. package/dist/material/shader/helper.js.map +1 -1
  50. package/dist/posteffect/bloom.js +1 -10
  51. package/dist/posteffect/bloom.js.map +1 -1
  52. package/dist/posteffect/compositor.js +43 -24
  53. package/dist/posteffect/compositor.js.map +1 -1
  54. package/dist/posteffect/fxaa.js +3 -11
  55. package/dist/posteffect/fxaa.js.map +1 -1
  56. package/dist/posteffect/grayscale.js +3 -11
  57. package/dist/posteffect/grayscale.js.map +1 -1
  58. package/dist/posteffect/posteffect.js +4 -0
  59. package/dist/posteffect/posteffect.js.map +1 -1
  60. package/dist/posteffect/sao.js +44 -24
  61. package/dist/posteffect/sao.js.map +1 -1
  62. package/dist/posteffect/ssr.js +536 -0
  63. package/dist/{material/lit.js.map → posteffect/ssr.js.map} +1 -1
  64. package/dist/posteffect/tonemap.js +3 -11
  65. package/dist/posteffect/tonemap.js.map +1 -1
  66. package/dist/posteffect/water.js +305 -337
  67. package/dist/posteffect/water.js.map +1 -1
  68. package/dist/render/abuffer_oit.js +2 -2
  69. package/dist/render/clipmap.js +16 -19
  70. package/dist/render/clipmap.js.map +1 -1
  71. package/dist/render/cull_visitor.js +5 -3
  72. package/dist/render/cull_visitor.js.map +1 -1
  73. package/dist/render/depthpass.js +17 -1
  74. package/dist/render/depthpass.js.map +1 -1
  75. package/dist/render/drawable_mixin.js +25 -19
  76. package/dist/render/drawable_mixin.js.map +1 -1
  77. package/dist/render/envlight.js +4 -2
  78. package/dist/render/envlight.js.map +1 -1
  79. package/dist/render/fft_wavegenerator.js +989 -0
  80. package/dist/{shaders/framework.js.map → render/fft_wavegenerator.js.map} +1 -1
  81. package/dist/render/gerstner_wavegenerator.js +265 -0
  82. package/dist/{material/standard.js.map → render/gerstner_wavegenerator.js.map} +1 -1
  83. package/dist/render/globalbindgroup_allocator.js +2 -1
  84. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  85. package/dist/render/hzb.js +273 -0
  86. package/dist/{material/terrainlightmodel.js.map → render/hzb.js.map} +1 -1
  87. package/dist/render/lightpass.js +35 -3
  88. package/dist/render/lightpass.js.map +1 -1
  89. package/dist/render/objectcolorpass.js +2 -1
  90. package/dist/render/objectcolorpass.js.map +1 -1
  91. package/dist/render/render_queue.js +72 -52
  92. package/dist/render/render_queue.js.map +1 -1
  93. package/dist/render/renderbundle_wrapper.js +79 -0
  94. package/dist/render/renderbundle_wrapper.js.map +1 -1
  95. package/dist/render/renderer.js +75 -36
  96. package/dist/render/renderer.js.map +1 -1
  97. package/dist/render/renderpass.js +16 -13
  98. package/dist/render/renderpass.js.map +1 -1
  99. package/dist/render/shadowmap_pass.js +6 -0
  100. package/dist/render/shadowmap_pass.js.map +1 -1
  101. package/dist/render/sky.js +12 -13
  102. package/dist/render/sky.js.map +1 -1
  103. package/dist/render/watermesh.js +94 -828
  104. package/dist/render/watermesh.js.map +1 -1
  105. package/dist/render/wavegenerator.js +8 -0
  106. package/dist/render/wavegenerator.js.map +1 -0
  107. package/dist/scene/batchgroup.js +60 -14
  108. package/dist/scene/batchgroup.js.map +1 -1
  109. package/dist/scene/environment.js +2 -2
  110. package/dist/scene/graph_node.js +0 -5
  111. package/dist/scene/graph_node.js.map +1 -1
  112. package/dist/scene/light.js +5 -5
  113. package/dist/scene/mesh.js +34 -18
  114. package/dist/scene/mesh.js.map +1 -1
  115. package/dist/scene/octree.js +5 -2
  116. package/dist/scene/octree.js.map +1 -1
  117. package/dist/scene/raycast_visitor.js +4 -2
  118. package/dist/scene/raycast_visitor.js.map +1 -1
  119. package/dist/scene/scene.js +1 -1
  120. package/dist/scene/scene_node.js +9 -5
  121. package/dist/scene/scene_node.js.map +1 -1
  122. package/dist/scene/terrain/grass.js +3 -4
  123. package/dist/scene/terrain/grass.js.map +1 -1
  124. package/dist/scene/terrain/heightfield.js +135 -53
  125. package/dist/scene/terrain/heightfield.js.map +1 -1
  126. package/dist/scene/terrain/patch.js +3 -4
  127. package/dist/scene/terrain/patch.js.map +1 -1
  128. package/dist/scene/terrain/terrain.js +1 -1
  129. package/dist/scene/xform.js +7 -9
  130. package/dist/scene/xform.js.map +1 -1
  131. package/dist/shaders/misc.js +10 -1
  132. package/dist/shaders/misc.js.map +1 -1
  133. package/dist/shaders/noise.js +81 -16
  134. package/dist/shaders/noise.js.map +1 -1
  135. package/dist/shaders/shadow.js +1 -9
  136. package/dist/shaders/shadow.js.map +1 -1
  137. package/dist/shaders/ssr.js +442 -0
  138. package/dist/{material/terrainmat.js.map → shaders/ssr.js.map} +1 -1
  139. package/dist/shaders/water.js +377 -250
  140. package/dist/shaders/water.js.map +1 -1
  141. package/dist/shadow/shadowmapper.js +11 -11
  142. package/dist/shapes/cylinder.js +6 -5
  143. package/dist/shapes/cylinder.js.map +1 -1
  144. package/dist/utility/bounding_volume.js +1 -53
  145. package/dist/utility/bounding_volume.js.map +1 -1
  146. package/dist/utility/misc.js +93 -0
  147. package/dist/utility/misc.js.map +1 -0
  148. package/dist/utility/shprojection.js +2 -7
  149. package/dist/utility/shprojection.js.map +1 -1
  150. package/dist/utility/textures/ggxlut.js +213 -0
  151. package/dist/utility/textures/ggxlut.js.map +1 -0
  152. package/dist/utility/textures/gradientnoise.js +61 -0
  153. package/dist/utility/textures/gradientnoise.js.map +1 -0
  154. package/dist/utility/textures/randomnoise.js +41 -0
  155. package/dist/utility/textures/randomnoise.js.map +1 -0
  156. package/dist/values.js +8 -1
  157. package/dist/values.js.map +1 -1
  158. package/package.json +4 -8
  159. package/dist/animation/usertrack.js +0 -47
  160. package/dist/animation/usertrack.js.map +0 -1
  161. package/dist/material/grassmat.js +0 -127
  162. package/dist/material/grassmat.js.map +0 -1
  163. package/dist/material/lightmodel.js +0 -2074
  164. package/dist/material/lightmodel.js.map +0 -1
  165. package/dist/material/lit.js +0 -578
  166. package/dist/material/mixins/pbr/metallicroughness.js +0 -126
  167. package/dist/material/mixins/pbr/metallicroughness.js.map +0 -1
  168. package/dist/material/mixins/pbr/specularglossness.js +0 -104
  169. package/dist/material/mixins/pbr/specularglossness.js.map +0 -1
  170. package/dist/material/pbr.js +0 -27
  171. package/dist/material/pbr.js.map +0 -1
  172. package/dist/material/standard.js +0 -282
  173. package/dist/material/terrainlightmodel.js +0 -259
  174. package/dist/material/terrainmat.js +0 -357
  175. package/dist/render/depth_pass.js +0 -47
  176. package/dist/render/depth_pass.js.map +0 -1
  177. package/dist/render/forward.js +0 -186
  178. package/dist/render/forward.js.map +0 -1
  179. package/dist/render/forward_pass.js +0 -137
  180. package/dist/render/forward_pass.js.map +0 -1
  181. package/dist/render/helper.js +0 -38
  182. package/dist/render/helper.js.map +0 -1
  183. package/dist/render/objectpool.js +0 -295
  184. package/dist/render/objectpool.js.map +0 -1
  185. package/dist/render/renderscheme.js +0 -61
  186. package/dist/render/renderscheme.js.map +0 -1
  187. package/dist/render/temporalcache.js +0 -222
  188. package/dist/scene/model.js +0 -111
  189. package/dist/scene/model.js.map +0 -1
  190. package/dist/scene/octree_update_visitor.js +0 -20
  191. package/dist/scene/octree_update_visitor.js.map +0 -1
  192. package/dist/shaders/builtins.js +0 -110
  193. package/dist/shaders/builtins.js.map +0 -1
  194. package/dist/shaders/framework.js +0 -723
  195. package/dist/shaders/lighting.js +0 -335
  196. package/dist/shaders/lighting.js.map +0 -1
  197. package/dist/utility/sheenlut.js +0 -196
  198. package/dist/utility/sheenlut.js.map +0 -1
package/dist/index.js CHANGED
@@ -2,7 +2,9 @@ export { prefilterCubemap } from './utility/pmrem.js';
2
2
  export { panoramaToCubemap } from './utility/panorama.js';
3
3
  export { projectCubemap, projectCubemapCPU } from './utility/shprojection.js';
4
4
  export { AABBTree } from './utility/aabbtree.js';
5
- export { BoundingBox, BoundingBoxTree } from './utility/bounding_volume.js';
5
+ export { BoundingBox } from './utility/bounding_volume.js';
6
+ export { createGradientNoiseTexture } from './utility/textures/gradientnoise.js';
7
+ export { createRandomNoiseTexture } from './utility/textures/randomnoise.js';
6
8
  export { Shape } from './shapes/shape.js';
7
9
  export { BoxFrameShape, BoxShape } from './shapes/box.js';
8
10
  export { CylinderShape } from './shapes/cylinder.js';
@@ -20,10 +22,13 @@ export { Clipmap } from './render/clipmap.js';
20
22
  export { EnvConstantAmbient, EnvHemisphericAmbient, EnvIBL, EnvShIBL, EnvironmentLighting } from './render/envlight.js';
21
23
  export { Primitive } from './render/primitive.js';
22
24
  export { CullVisitor } from './render/cull_visitor.js';
23
- export { WaterMesh, defaultBuildParams } from './render/watermesh.js';
25
+ export { WaterMesh } from './render/watermesh.js';
24
26
  export { OIT } from './render/oit.js';
25
27
  export { WeightedBlendedOIT } from './render/weightedblended_oit.js';
26
28
  export { ABufferOIT } from './render/abuffer_oit.js';
29
+ export { WaveGenerator } from './render/wavegenerator.js';
30
+ export { FFTWaveGenerator } from './render/fft_wavegenerator.js';
31
+ export { GerstnerWaveGenerator } from './render/gerstner_wavegenerator.js';
27
32
  export { ShaderHelper } from './material/shader/helper.js';
28
33
  export { LambertMaterial } from './material/lambert.js';
29
34
  export { BlinnMaterial } from './material/blinn.js';
@@ -71,9 +76,9 @@ export { PerspectiveCamera } from './camera/perspectivecamera.js';
71
76
  export { BaseCameraController } from './camera/base.js';
72
77
  export { FPSCameraController } from './camera/fps.js';
73
78
  export { OrbitCameraController } from './camera/orbit.js';
74
- export { decode2HalfFromRGBA, decodeFloatFromRGBA, decodeNormalizedFloatFromRGBA, decodeRGBM, encode2HalfToRGBA, encodeFloatToRGBA, encodeNormalizedFloatToRGBA, encodeRGBM, gammaToLinear, linearToGamma } from './shaders/misc.js';
75
- export { noise3D, noisef, smoothNoise3D, worleyFBM, worleyNoise } from './shaders/noise.js';
76
- export { createProgramFFT2H, createProgramFFT2V, createProgramH0, createProgramHk, createProgramOcean, createProgramPostFFT2 } from './shaders/water.js';
79
+ export { decode2HalfFromRGBA, decodeFloatFromRGBA, decodeNormalizedFloatFromRGBA, decodeRGBM, encode2HalfToRGBA, encodeFloatToRGBA, encodeNormalizedFloatToRGBA, encodeRGBM, fetchNormalizedFloatForDevice, gammaToLinear, linearToGamma } from './shaders/misc.js';
80
+ export { gradient, hash, interleavedGradientNoise, noise3D, perlinNoise2D, perlinNoise3D, smoothNoise3D, worleyFBM, worleyNoise } from './shaders/noise.js';
81
+ export { WaterShaderImpl, createProgramFFT2H, createProgramFFT2V, createProgramH0, createProgramHk, createProgramOcean, createProgramPostFFT2 } from './shaders/water.js';
77
82
  export { ShadowMapper } from './shadow/shadowmapper.js';
78
83
  export { ESM } from './shadow/esm.js';
79
84
  export { PCFPD } from './shadow/pcf_pd.js';
@@ -85,7 +90,7 @@ export { Blitter } from './blitter/blitter.js';
85
90
  export { GaussianBlurBlitter } from './blitter/gaussianblur.js';
86
91
  export { BoxFilterBlitter } from './blitter/box.js';
87
92
  export { CopyBlitter } from './blitter/copy.js';
88
- export { BUILTIN_ASSET_TEST_CUBEMAP, BUILTIN_ASSET_TEXTURE_SHEEN_LUT, LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_NONE, LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT, MAX_CLUSTERED_LIGHTS, MAX_MORPH_ATTRIBUTES, MAX_MORPH_TARGETS, MORPH_ATTRIBUTE_VECTOR_COUNT, MORPH_TARGET_COLOR, MORPH_TARGET_NORMAL, MORPH_TARGET_POSITION, MORPH_TARGET_TANGENT, MORPH_TARGET_TEX0, MORPH_TARGET_TEX1, MORPH_TARGET_TEX2, MORPH_TARGET_TEX3, MORPH_WEIGHTS_VECTOR_COUNT, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_DEPTH, RENDER_PASS_TYPE_LIGHT, RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from './values.js';
93
+ export { BUILTIN_ASSET_TEST_CUBEMAP, BUILTIN_ASSET_TEXTURE_SHEEN_LUT, LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_NONE, LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT, MAX_CLUSTERED_LIGHTS, MAX_MORPH_ATTRIBUTES, MAX_MORPH_TARGETS, MORPH_ATTRIBUTE_VECTOR_COUNT, MORPH_TARGET_COLOR, MORPH_TARGET_NORMAL, MORPH_TARGET_POSITION, MORPH_TARGET_TANGENT, MORPH_TARGET_TEX0, MORPH_TARGET_TEX1, MORPH_TARGET_TEX2, MORPH_TARGET_TEX3, MORPH_WEIGHTS_VECTOR_COUNT, MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_DEPTH, RENDER_PASS_TYPE_LIGHT, RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from './values.js';
89
94
  export { AbstractPostEffect } from './posteffect/posteffect.js';
90
95
  export { Grayscale } from './posteffect/grayscale.js';
91
96
  export { Tonemap } from './posteffect/tonemap.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2,7 +2,7 @@ import { applyMaterialMixins, MeshMaterial } from './meshmaterial.js';
2
2
  import { mixinVertexColor } from './mixins/vertexcolor.js';
3
3
  import { mixinBlinnPhong } from './mixins/lightmodel/blinnphong.js';
4
4
  import { ShaderHelper } from './shader/helper.js';
5
- import { RENDER_PASS_TYPE_LIGHT } from '../values.js';
5
+ import { RENDER_PASS_TYPE_LIGHT, MaterialVaryingFlags } from '../values.js';
6
6
 
7
7
  /**
8
8
  * Blinn material
@@ -55,8 +55,14 @@ import { RENDER_PASS_TYPE_LIGHT } from '../values.js';
55
55
  if (this.drawContext.renderPass.type === RENDER_PASS_TYPE_LIGHT) {
56
56
  scope.$l.normal = this.calculateNormal(scope, scope.$inputs.worldPos, scope.$inputs.wNorm, scope.$inputs.wTangent, scope.$inputs.wBinormal);
57
57
  scope.$l.viewVec = this.calculateViewVector(scope, scope.$inputs.worldPos);
58
- scope.$l.litColor = this.blinnPhongLight(scope, scope.$inputs.worldPos, scope.normal, scope.viewVec, scope.albedo);
59
- this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));
58
+ if (this.drawContext.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS) {
59
+ scope.$l.outRoughness = pb.vec4();
60
+ scope.$l.litColor = this.blinnPhongLight(scope, scope.$inputs.worldPos, scope.normal, scope.viewVec, scope.albedo, scope.outRoughness);
61
+ this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a), scope.outRoughness, pb.vec4(pb.add(pb.mul(scope.normal, 0.5), pb.vec3(0.5)), 1));
62
+ } else {
63
+ scope.$l.litColor = this.blinnPhongLight(scope, scope.$inputs.worldPos, scope.normal, scope.viewVec, scope.albedo);
64
+ this.outputFragmentColor(scope, scope.$inputs.worldPos, pb.vec4(scope.litColor, scope.albedo.a));
65
+ }
60
66
  } else {
61
67
  this.outputFragmentColor(scope, scope.$inputs.worldPos, scope.albedo);
62
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"blinn.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"blinn.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2,7 +2,7 @@ import { mixinLight } from './mixins/lit.js';
2
2
  import { mixinVertexColor } from './mixins/vertexcolor.js';
3
3
  import { applyMaterialMixins, MeshMaterial } from './meshmaterial.js';
4
4
  import { ShaderHelper } from './shader/helper.js';
5
- import { RENDER_PASS_TYPE_LIGHT } from '../values.js';
5
+ import { RENDER_PASS_TYPE_LIGHT, MaterialVaryingFlags } from '../values.js';
6
6
 
7
7
  /**
8
8
  * Lambert material
@@ -69,7 +69,11 @@ import { RENDER_PASS_TYPE_LIGHT } from '../values.js';
69
69
  this.color = pb.add(this.color, this.lightContrib);
70
70
  });
71
71
  scope.$l.litColor = pb.mul(scope.albedo, pb.vec4(scope.color, 1));
72
- this.outputFragmentColor(scope, scope.$inputs.worldPos, scope.litColor);
72
+ if (this.drawContext.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS) {
73
+ this.outputFragmentColor(scope, scope.$inputs.worldPos, scope.litColor, pb.vec4(0, 0, 0, 1), pb.vec4(pb.add(pb.mul(scope.normal, 0.5), pb.vec3(0.5)), 1));
74
+ } else {
75
+ this.outputFragmentColor(scope, scope.$inputs.worldPos, scope.litColor);
76
+ }
73
77
  } else {
74
78
  this.outputFragmentColor(scope, scope.$inputs.worldPos, scope.albedo);
75
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lambert.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"lambert.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,6 @@
1
1
  import { ProgramBuilder } from '@zephyr3d/device';
2
2
  import { QUEUE_OPAQUE } from '../values.js';
3
+ import { RenderBundleWrapper } from '../render/renderbundle_wrapper.js';
3
4
 
4
5
  /**
5
6
  * Base class for any kind of materials
@@ -113,7 +114,7 @@ import { QUEUE_OPAQUE } from '../values.js';
113
114
  device.setRenderStates(state.renderStateSet);
114
115
  }
115
116
  /** @internal */ calcGlobalHash(ctx, pass) {
116
- return `${this.getHash(pass)}:${Number(!!ctx.morphAnimation)}${Number(!!ctx.skinAnimation)}:${Number(!!ctx.instancing)}:${ctx.renderPassHash}`;
117
+ return `${this.getHash(pass)}:${ctx.materialFlags}:${ctx.renderPassHash}`;
117
118
  }
118
119
  /**
119
120
  * Draws a primitive using this material
@@ -144,6 +145,7 @@ import { QUEUE_OPAQUE } from '../values.js';
144
145
  for(let i = 0; i < this._numPasses; i++){
145
146
  this._hash[i] = null;
146
147
  }
148
+ RenderBundleWrapper.materialChanged(this);
147
149
  }
148
150
  }
149
151
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"material.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"material.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { ProgramBuilder } from '@zephyr3d/device';
2
- import { RENDER_PASS_TYPE_OBJECT_COLOR, QUEUE_TRANSPARENT, QUEUE_OPAQUE, RENDER_PASS_TYPE_SHADOWMAP, RENDER_PASS_TYPE_LIGHT, RENDER_PASS_TYPE_DEPTH } from '../values.js';
2
+ import { RENDER_PASS_TYPE_OBJECT_COLOR, QUEUE_OPAQUE, RENDER_PASS_TYPE_SHADOWMAP, MaterialVaryingFlags, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT, RENDER_PASS_TYPE_DEPTH } from '../values.js';
3
3
  import { Material } from './material.js';
4
4
  import { encodeNormalizedFloatToRGBA } from '../shaders/misc.js';
5
5
  import { Application } from '../app.js';
@@ -96,18 +96,19 @@ let FEATURE_ALPHATOCOVERAGE = 0;
96
96
  instance.coreMaterial = that;
97
97
  // Copy original uniform values
98
98
  for(let i = 0; i < instanceUniforms.length; i++){
99
- const [prop, type] = instanceUniforms[i];
99
+ const instanceIndex = i;
100
+ const [prop, type] = instanceUniforms[instanceIndex];
100
101
  const value = that[prop];
101
102
  switch(type){
102
103
  case 'float':
103
104
  {
104
- uniformsHolder[i * 4] = Number(value);
105
+ uniformsHolder[instanceIndex * 4] = Number(value);
105
106
  Object.defineProperty(instance, prop, {
106
107
  get () {
107
- return uniformsHolder[i * 4];
108
+ return uniformsHolder[instanceIndex * 4];
108
109
  },
109
110
  set (value) {
110
- uniformsHolder[i * 4 + 0] = value;
111
+ uniformsHolder[instanceIndex * 4 + 0] = value;
111
112
  that[prop] = value;
112
113
  }
113
114
  });
@@ -118,14 +119,18 @@ let FEATURE_ALPHATOCOVERAGE = 0;
118
119
  if (!(value instanceof Vector2)) {
119
120
  throw new Error(`Instance uniform property ${prop} must be of type Vector2`);
120
121
  }
121
- uniformsHolder[i * 4] = value.x;
122
- uniformsHolder[i * 4 + 1] = value.y;
122
+ uniformsHolder[instanceIndex * 4] = value.x;
123
+ uniformsHolder[instanceIndex * 4 + 1] = value.y;
123
124
  Object.defineProperty(instance, prop, {
124
125
  get () {
125
- return new Vector2(uniformsHolder[i * 4], uniformsHolder[i * 4 + 1]);
126
+ return new Vector2(uniformsHolder[instanceIndex * 4], uniformsHolder[instanceIndex * 4 + 1]);
126
127
  },
127
128
  set (value) {
128
- uniformsHolder.set(value);
129
+ if (!(value instanceof Vector2)) {
130
+ throw new Error(`Instance uniform property ${prop} must be of type Vector2`);
131
+ }
132
+ uniformsHolder[instanceIndex * 4] = value.x;
133
+ uniformsHolder[instanceIndex * 4 + 1] = value.y;
129
134
  that[prop] = value;
130
135
  }
131
136
  });
@@ -136,15 +141,20 @@ let FEATURE_ALPHATOCOVERAGE = 0;
136
141
  if (!(value instanceof Vector3)) {
137
142
  throw new Error(`Instance uniform property ${prop} must be of type Vector3`);
138
143
  }
139
- uniformsHolder[i * 4] = value.x;
140
- uniformsHolder[i * 4 + 1] = value.y;
141
- uniformsHolder[i * 4 + 2] = value.z;
144
+ uniformsHolder[instanceIndex * 4] = value.x;
145
+ uniformsHolder[instanceIndex * 4 + 1] = value.y;
146
+ uniformsHolder[instanceIndex * 4 + 2] = value.z;
142
147
  Object.defineProperty(instance, prop, {
143
148
  get () {
144
- return new Vector3(uniformsHolder[i * 4], uniformsHolder[i * 4 + 1], uniformsHolder[i * 4 + 2]);
149
+ return new Vector3(uniformsHolder[instanceIndex * 4], uniformsHolder[instanceIndex * 4 + 1], uniformsHolder[instanceIndex * 4 + 2]);
145
150
  },
146
151
  set (value) {
147
- uniformsHolder.set(value);
152
+ if (!(value instanceof Vector3)) {
153
+ throw new Error(`Instance uniform property ${prop} must be of type Vector3`);
154
+ }
155
+ uniformsHolder[instanceIndex * 4] = value.x;
156
+ uniformsHolder[instanceIndex * 4 + 1] = value.y;
157
+ uniformsHolder[instanceIndex * 4 + 2] = value.z;
148
158
  that[prop] = value;
149
159
  }
150
160
  });
@@ -155,16 +165,22 @@ let FEATURE_ALPHATOCOVERAGE = 0;
155
165
  if (!(value instanceof Vector4)) {
156
166
  throw new Error(`Instance uniform property ${prop} must be of type Vector4`);
157
167
  }
158
- uniformsHolder[i * 4] = value.x;
159
- uniformsHolder[i * 4 + 1] = value.y;
160
- uniformsHolder[i * 4 + 2] = value.z;
161
- uniformsHolder[i * 4 + 3] = value.w;
168
+ uniformsHolder[instanceIndex * 4] = value.x;
169
+ uniformsHolder[instanceIndex * 4 + 1] = value.y;
170
+ uniformsHolder[instanceIndex * 4 + 2] = value.z;
171
+ uniformsHolder[instanceIndex * 4 + 3] = value.w;
162
172
  Object.defineProperty(instance, prop, {
163
173
  get () {
164
- return new Vector4(uniformsHolder[i * 4], uniformsHolder[i * 4 + 1], uniformsHolder[i * 4 + 2], uniformsHolder[i * 4 + 3]);
174
+ return new Vector4(uniformsHolder[instanceIndex * 4], uniformsHolder[instanceIndex * 4 + 1], uniformsHolder[instanceIndex * 4 + 2], uniformsHolder[instanceIndex * 4 + 3]);
165
175
  },
166
176
  set (value) {
167
- uniformsHolder.set(value);
177
+ if (!(value instanceof Vector4)) {
178
+ throw new Error(`Instance uniform property ${prop} must be of type Vector4`);
179
+ }
180
+ uniformsHolder[instanceIndex * 4] = value.x;
181
+ uniformsHolder[instanceIndex * 4 + 1] = value.y;
182
+ uniformsHolder[instanceIndex * 4 + 2] = value.z;
183
+ uniformsHolder[instanceIndex * 4 + 3] = value.w;
168
184
  that[prop] = value;
169
185
  }
170
186
  });
@@ -241,6 +257,7 @@ let FEATURE_ALPHATOCOVERAGE = 0;
241
257
  const isObjectColorPass = ctx.renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR;
242
258
  const blending = !isObjectColorPass && (this.featureUsed(FEATURE_ALPHABLEND) || ctx.lightBlending);
243
259
  const a2c = !isObjectColorPass && this.featureUsed(FEATURE_ALPHATOCOVERAGE);
260
+ const ztestEq = ctx.queue === QUEUE_OPAQUE && !!ctx.depthTexture;
244
261
  if (blending || a2c) {
245
262
  const blendingState = stateSet.useBlendingState();
246
263
  if (blending) {
@@ -256,21 +273,33 @@ let FEATURE_ALPHATOCOVERAGE = 0;
256
273
  blendingState.enable(false);
257
274
  }
258
275
  blendingState.enableAlphaToCoverage(a2c);
259
- if (blendingState.enabled) {
276
+ if (ztestEq) {
277
+ stateSet.useDepthState().setCompareFunc('eq').enableTest(true).enableWrite(false);
278
+ } else if (blendingState.enabled) {
260
279
  stateSet.useDepthState().enableTest(true).enableWrite(false);
261
280
  } else {
262
281
  stateSet.defaultDepthState();
263
282
  }
264
283
  } else if (stateSet.blendingState?.enabled && !blending) {
265
284
  stateSet.defaultBlendingState();
266
- stateSet.defaultDepthState();
285
+ if (ztestEq) {
286
+ stateSet.useDepthState().setCompareFunc('eq').enableTest(true).enableWrite(false);
287
+ } else {
288
+ stateSet.defaultDepthState();
289
+ }
267
290
  }
268
- if (this._cullMode !== 'back') {
269
- stateSet.useRasterizerState().cullMode = this._cullMode;
291
+ if (ctx.forceCullMode || this._cullMode !== 'back') {
292
+ stateSet.useRasterizerState().cullMode = ctx.forceCullMode || this._cullMode;
293
+ } else if (ctx.renderPass.type === RENDER_PASS_TYPE_SHADOWMAP) {
294
+ stateSet.useRasterizerState().cullMode = 'none';
270
295
  } else {
271
296
  stateSet.defaultRasterizerState();
272
297
  }
273
- stateSet.defaultColorState();
298
+ if (ctx.forceColorState) {
299
+ stateSet.useColorState(ctx.forceColorState);
300
+ } else {
301
+ stateSet.defaultColorState();
302
+ }
274
303
  stateSet.defaultStencilState();
275
304
  if (ctx.oit) {
276
305
  ctx.oit.setRenderStates(stateSet);
@@ -292,7 +321,7 @@ let FEATURE_ALPHATOCOVERAGE = 0;
292
321
  if (ctx.oit) {
293
322
  ctx.oit.applyUniforms(ctx, bindGroup);
294
323
  }
295
- if (!ctx.instancing && ctx.renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR) {
324
+ if (!(ctx.materialFlags & MaterialVaryingFlags.INSTANCING) && ctx.renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR) {
296
325
  bindGroup.setValue('zObjectColor', this._objectColor);
297
326
  }
298
327
  }
@@ -365,14 +394,14 @@ let FEATURE_ALPHATOCOVERAGE = 0;
365
394
  */ vertexShader(scope) {
366
395
  const pb = scope.$builder;
367
396
  ShaderHelper.prepareVertexShader(pb, this.drawContext);
368
- if (this.drawContext.skinAnimation) {
397
+ if (this.drawContext.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {
369
398
  scope.$inputs.zBlendIndices = pb.vec4().attrib('blendIndices');
370
399
  scope.$inputs.zBlendWeights = pb.vec4().attrib('blendWeights');
371
400
  }
372
- if (this.drawContext.morphAnimation && this.drawContext.device.type === 'webgl') {
401
+ if (this.drawContext.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION && this.drawContext.device.type === 'webgl') {
373
402
  scope.$inputs.zFakeVertexID = pb.float().attrib('texCoord7');
374
403
  }
375
- if (this.drawContext.renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR && this.drawContext.instancing) {
404
+ if (this.drawContext.renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR && this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING) {
376
405
  scope.$outputs.zObjectColor = this.getInstancedUniform(scope, MeshMaterial.OBJECT_COLOR_UNIFORM);
377
406
  }
378
407
  }
@@ -389,7 +418,7 @@ let FEATURE_ALPHATOCOVERAGE = 0;
389
418
  if (this.isTransparentPass(this.pass)) {
390
419
  scope.zOpacity = pb.float().uniform(2);
391
420
  }
392
- } else if (this.drawContext.renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR && !this.drawContext.instancing) {
421
+ } else if (this.drawContext.renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR && !(this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING)) {
393
422
  scope.zObjectColor = pb.vec4().uniform(2);
394
423
  }
395
424
  }
@@ -413,6 +442,10 @@ let FEATURE_ALPHATOCOVERAGE = 0;
413
442
  that.drawContext.oit.setupFragmentOutput(this);
414
443
  } else {
415
444
  this.$outputs.zFragmentOutput = pb.vec4();
445
+ if (ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS) {
446
+ this.$outputs.zSSRRoughness = pb.vec4();
447
+ this.$outputs.zSSRNormal = pb.vec4();
448
+ }
416
449
  }
417
450
  pb.main(function() {
418
451
  that.fragmentShader(this);
@@ -434,7 +467,7 @@ let FEATURE_ALPHATOCOVERAGE = 0;
434
467
  * @param color - Lit fragment color
435
468
  *
436
469
  * @returns The final fragment color
437
- */ outputFragmentColor(scope, worldPos, color) {
470
+ */ outputFragmentColor(scope, worldPos, color, ssrRoughness, ssrNormal) {
438
471
  const pb = scope.$builder;
439
472
  const that = this;
440
473
  const funcName = 'Z_outputFragmentColor';
@@ -471,9 +504,12 @@ let FEATURE_ALPHATOCOVERAGE = 0;
471
504
  });
472
505
  }
473
506
  ShaderHelper.discardIfClipped(this, this.worldPos);
507
+ const depthPass = that.drawContext.renderPass;
474
508
  this.$l.depth = ShaderHelper.nonLinearDepthToLinearNormalized(this, this.$builtins.fragCoord.z);
475
- if (that.drawContext.device.type === 'webgl') {
509
+ if (depthPass.encodeDepth) {
476
510
  this.$outputs.zFragmentOutput = encodeNormalizedFloatToRGBA(this, this.depth);
511
+ } else if (depthPass.renderBackface) {
512
+ this.$outputs.zFragmentOutput = pb.vec4(0, this.depth, 0, 1);
477
513
  } else {
478
514
  this.$outputs.zFragmentOutput = pb.vec4(this.depth, 0, 0, 1);
479
515
  }
@@ -484,7 +520,7 @@ let FEATURE_ALPHATOCOVERAGE = 0;
484
520
  });
485
521
  }
486
522
  ShaderHelper.discardIfClipped(this, this.worldPos);
487
- this.$outputs.zFragmentOutput = that.drawContext.instancing ? scope.$inputs.zObjectColor : scope.zObjectColor;
523
+ this.$outputs.zFragmentOutput = that.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING ? scope.$inputs.zObjectColor : scope.zObjectColor;
488
524
  } else {
489
525
  if (color) {
490
526
  this.$if(pb.lessThan(this.outColor.a, this.zAlphaCutoff), function() {
@@ -497,6 +533,10 @@ let FEATURE_ALPHATOCOVERAGE = 0;
497
533
  }
498
534
  });
499
535
  color ? pb.getGlobalScope()[funcName](worldPos, color) : pb.getGlobalScope()[funcName](worldPos);
536
+ if (that.drawContext.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS) {
537
+ scope.$outputs.zSSRRoughness = ssrRoughness ?? pb.vec4(1, 0, 0, 1);
538
+ scope.$outputs.zSSRNormal = ssrNormal ?? pb.vec4(0);
539
+ }
500
540
  }
501
541
  }
502
542
  FEATURE_ALPHATEST = MeshMaterial.defineFeature();
@@ -1 +1 @@
1
- {"version":3,"file":"meshmaterial.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"meshmaterial.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,6 +1,7 @@
1
1
  import { Vector4 } from '@zephyr3d/base';
2
2
  import { applyMaterialMixins } from '../meshmaterial.js';
3
3
  import { mixinTextureProps } from './texture.js';
4
+ import { MaterialVaryingFlags } from '../../values.js';
4
5
 
5
6
  /**
6
7
  * Albedo color mixin
@@ -29,7 +30,7 @@ import { mixinTextureProps } from './texture.js';
29
30
  this.uniformChanged();
30
31
  }
31
32
  getUniformValueAlbedoColor(scope) {
32
- return this.drawContext.instancing ? scope.$inputs.zAlbedo : scope.zAlbedo;
33
+ return this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING ? scope.$inputs.zAlbedo : scope.zAlbedo;
33
34
  }
34
35
  calculateAlbedoColor(scope, uv) {
35
36
  const pb = scope.$builder;
@@ -46,21 +47,21 @@ import { mixinTextureProps } from './texture.js';
46
47
  vertexShader(scope) {
47
48
  super.vertexShader(scope);
48
49
  if (this.needFragmentColor()) {
49
- if (this.drawContext.instancing) {
50
+ if (this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING) {
50
51
  scope.$outputs.zAlbedo = this.getInstancedUniform(scope, ALBEDO_COLOR_UNIFORM);
51
52
  }
52
53
  }
53
54
  }
54
55
  fragmentShader(scope) {
55
56
  super.fragmentShader(scope);
56
- if (this.needFragmentColor() && !this.drawContext.instancing) {
57
+ if (this.needFragmentColor() && !(this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING)) {
57
58
  const pb = scope.$builder;
58
59
  scope.zAlbedo = pb.vec4().uniform(2);
59
60
  }
60
61
  }
61
62
  applyUniformValues(bindGroup, ctx, pass) {
62
63
  super.applyUniformValues(bindGroup, ctx, pass);
63
- if (this.needFragmentColor(ctx) && !ctx.instancing) {
64
+ if (this.needFragmentColor(ctx) && !(ctx.materialFlags & MaterialVaryingFlags.INSTANCING)) {
64
65
  bindGroup.setValue('zAlbedo', this._albedoColor);
65
66
  }
66
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"albedocolor.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"albedocolor.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,6 @@
1
1
  import { applyMaterialMixins } from '../../meshmaterial.js';
2
2
  import { mixinLight } from '../lit.js';
3
+ import { ShaderHelper } from '../../shader/helper.js';
3
4
 
4
5
  /**
5
6
  * Blinn-phong lighting model mixin
@@ -40,7 +41,7 @@ import { mixinLight } from '../lit.js';
40
41
  bindGroup.setValue('zShininess', this._shininess);
41
42
  }
42
43
  }
43
- blinnPhongLight(scope, worldPos, normal, viewVec, albedo) {
44
+ blinnPhongLight(scope, worldPos, normal, viewVec, albedo, outRoughness) {
44
45
  const pb = scope.$builder;
45
46
  const funcName = 'Z_blinnPhongLight';
46
47
  const that = this;
@@ -48,12 +49,15 @@ import { mixinLight } from '../lit.js';
48
49
  pb.vec3('worldPos'),
49
50
  pb.vec3('normal'),
50
51
  pb.vec3('viewVec'),
51
- pb.vec4('albedo')
52
+ pb.vec4('albedo'),
53
+ ...outRoughness ? [
54
+ pb.vec4('outRoughness').out()
55
+ ] : []
52
56
  ], function() {
53
57
  if (!that.needFragmentColor()) {
54
58
  this.$return(this.albedo.rgb);
55
59
  } else {
56
- if (that.needCalculateEnvLight()) {
60
+ if (that.needCalculateEnvLight() && !outRoughness) {
57
61
  this.$l.diffuseColor = that.getEnvLightIrradiance(this, this.normal);
58
62
  } else {
59
63
  this.$l.diffuseColor = pb.vec3(0);
@@ -69,18 +73,24 @@ import { mixinLight } from '../lit.js';
69
73
  this.$l.diffuse = pb.mul(this.lightColor, this.NoL);
70
74
  this.$l.specular = pb.mul(this.lightColor, pb.pow(this.NoH, this.zShininess));
71
75
  if (shadow) {
72
- this.$l.shadow = pb.vec3(that.calculateShadow(this, this.worldPos, this.NoL));
73
- this.diffuse = pb.mul(this.diffuse, this.shadow);
74
- this.specular = pb.mul(this.specular, this.shadow);
76
+ this.$if(pb.greaterThan(this.NoL, 0), function() {
77
+ this.$l.shadow = pb.vec3(that.calculateShadow(this, this.worldPos, this.NoL));
78
+ this.diffuse = pb.mul(this.diffuse, this.shadow);
79
+ this.specular = pb.mul(this.specular, this.shadow);
80
+ });
75
81
  }
76
82
  this.diffuseColor = pb.add(this.diffuseColor, this.diffuse);
77
83
  this.specularColor = pb.add(this.specularColor, this.specular);
78
84
  });
79
85
  this.$l.litColor = pb.add(pb.mul(this.albedo.rgb, this.diffuseColor), this.specularColor);
86
+ if (outRoughness) {
87
+ this.$l.roughness = pb.sqrt(pb.div(2, pb.add(this.zShininess, 2)));
88
+ this.outRoughness = pb.vec4(pb.mul(this.albedo.rgb, pb.sub(1, this.roughness)), pb.mul(this.roughness, ShaderHelper.getCameraRoughnessFactor(this)));
89
+ }
80
90
  this.$return(this.litColor);
81
91
  }
82
92
  });
83
- return pb.getGlobalScope()[funcName](worldPos, normal, viewVec, albedo);
93
+ return outRoughness ? pb.getGlobalScope()[funcName](worldPos, normal, viewVec, albedo, outRoughness) : pb.getGlobalScope()[funcName](worldPos, normal, viewVec, albedo);
84
94
  }
85
95
  };
86
96
  }
@@ -1 +1 @@
1
- {"version":3,"file":"blinnphong.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"blinnphong.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,11 +1,11 @@
1
1
  import { applyMaterialMixins } from '../../meshmaterial.js';
2
2
  import { mixinLight } from '../lit.js';
3
3
 
4
- /**
5
- * Lambert lighting model mixin
6
- * @param BaseCls - Class to mix in
7
- * @returns Mixed class
8
- * @public
4
+ /**
5
+ * Lambert lighting model mixin
6
+ * @param BaseCls - Class to mix in
7
+ * @returns Mixed class
8
+ * @public
9
9
  */ function mixinLambert(BaseCls) {
10
10
  if (BaseCls.lambertMixed) {
11
11
  return BaseCls;
@@ -3,6 +3,7 @@ import { mixinTextureProps } from '../texture.js';
3
3
  import { mixinPBRCommon } from '../pbr/common.js';
4
4
  import { Vector4 } from '@zephyr3d/base';
5
5
  import { mixinLight } from '../lit.js';
6
+ import { ShaderHelper } from '../../shader/helper.js';
6
7
 
7
8
  /**
8
9
  * PBRMetallicRoughness lighting model mixin
@@ -52,7 +53,7 @@ import { mixinLight } from '../lit.js';
52
53
  this.uniformChanged();
53
54
  }
54
55
  }
55
- PBRLight(scope, worldPos, normal, viewVec, albedo, TBN) {
56
+ PBRLight(scope, worldPos, normal, viewVec, albedo, TBN, outRoughness) {
56
57
  const pb = scope.$builder;
57
58
  const funcName = 'Z_PBRMetallicRoughnessLight';
58
59
  const that = this;
@@ -61,12 +62,19 @@ import { mixinLight } from '../lit.js';
61
62
  pb.vec3('normal'),
62
63
  pb.mat3('TBN'),
63
64
  pb.vec3('viewVec'),
64
- pb.vec4('albedo')
65
+ pb.vec4('albedo'),
66
+ ...outRoughness ? [
67
+ pb.vec4('outRoughness').out()
68
+ ] : []
65
69
  ], function() {
66
70
  this.$l.pbrData = that.getCommonData(this, this.albedo, this.normal, this.viewVec, this.TBN);
67
71
  this.$l.lightingColor = pb.vec3(0);
68
72
  this.$l.emissiveColor = that.calculateEmissiveColor(this);
69
- that.indirectLighting(this, this.normal, this.viewVec, this.pbrData, this.lightingColor);
73
+ if (outRoughness) {
74
+ that.indirectLighting(this, this.normal, this.viewVec, this.pbrData, this.lightingColor, this.outRoughness);
75
+ } else {
76
+ that.indirectLighting(this, this.normal, this.viewVec, this.pbrData, this.lightingColor);
77
+ }
70
78
  that.forEachLight(this, function(type, posRange, dirCutoff, colorIntensity, shadow) {
71
79
  this.$l.diffuse = pb.vec3();
72
80
  this.$l.specular = pb.vec3();
@@ -81,7 +89,7 @@ import { mixinLight } from '../lit.js';
81
89
  });
82
90
  this.$return(pb.add(this.lightingColor, this.emissiveColor));
83
91
  });
84
- return pb.getGlobalScope()[funcName](worldPos, normal, TBN, viewVec, albedo);
92
+ return outRoughness ? pb.getGlobalScope()[funcName](worldPos, normal, TBN, viewVec, albedo, outRoughness) : pb.getGlobalScope()[funcName](worldPos, normal, TBN, viewVec, albedo);
85
93
  }
86
94
  fragmentShader(scope) {
87
95
  super.fragmentShader(scope);
@@ -110,6 +118,7 @@ import { mixinLight } from '../lit.js';
110
118
  data.metallic = scope.zMetallic;
111
119
  data.roughness = scope.zRoughness;
112
120
  }
121
+ data.roughness = pb.mul(data.roughness, ShaderHelper.getCameraRoughnessFactor(scope));
113
122
  if (this.specularColorTexture) {
114
123
  scope.$l.specularColor = pb.mul(scope.zSpecularFactor.rgb, this.sampleSpecularColorTexture(scope).rgb);
115
124
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"pbrmetallicroughness.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"pbrmetallicroughness.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}