@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.
- package/dist/animation/animationset.js +37 -37
- package/dist/animation/morphtrack.js +7 -5
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/skeleton.js +11 -9
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -2
- package/dist/asset/loaders/gltf/gltf_loader.js +7 -3
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/asset/loaders/image/webimage_loader.js +16 -0
- package/dist/asset/loaders/image/webimage_loader.js.map +1 -1
- package/dist/asset/model.js +3 -9
- package/dist/asset/model.js.map +1 -1
- package/dist/blitter/bilateralblur.js +222 -0
- package/dist/{render/temporalcache.js.map → blitter/bilateralblur.js.map} +1 -1
- package/dist/blitter/blitter.js +7 -1
- package/dist/blitter/blitter.js.map +1 -1
- package/dist/blitter/depthlimitedgaussion.js +96 -39
- package/dist/blitter/depthlimitedgaussion.js.map +1 -1
- package/dist/blitter/gaussianblur.js +21 -21
- package/dist/camera/camera.js +142 -1
- package/dist/camera/camera.js.map +1 -1
- package/dist/index.d.ts +1178 -745
- package/dist/index.js +11 -6
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +9 -3
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/lambert.js +6 -2
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +3 -1
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +73 -33
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/albedocolor.js +5 -4
- package/dist/material/mixins/albedocolor.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +17 -7
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +5 -5
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +13 -4
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +13 -4
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +27 -15
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/pbrmr.js +14 -3
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +14 -3
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +36 -21
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/posteffect/bloom.js +1 -10
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js +43 -24
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/fxaa.js +3 -11
- package/dist/posteffect/fxaa.js.map +1 -1
- package/dist/posteffect/grayscale.js +3 -11
- package/dist/posteffect/grayscale.js.map +1 -1
- package/dist/posteffect/posteffect.js +4 -0
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +44 -24
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/ssr.js +536 -0
- package/dist/{material/lit.js.map → posteffect/ssr.js.map} +1 -1
- package/dist/posteffect/tonemap.js +3 -11
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/posteffect/water.js +305 -337
- package/dist/posteffect/water.js.map +1 -1
- package/dist/render/abuffer_oit.js +2 -2
- package/dist/render/clipmap.js +16 -19
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cull_visitor.js +5 -3
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/depthpass.js +17 -1
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +25 -19
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/envlight.js +4 -2
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +989 -0
- package/dist/{shaders/framework.js.map → render/fft_wavegenerator.js.map} +1 -1
- package/dist/render/gerstner_wavegenerator.js +265 -0
- package/dist/{material/standard.js.map → render/gerstner_wavegenerator.js.map} +1 -1
- package/dist/render/globalbindgroup_allocator.js +2 -1
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/hzb.js +273 -0
- package/dist/{material/terrainlightmodel.js.map → render/hzb.js.map} +1 -1
- package/dist/render/lightpass.js +35 -3
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/objectcolorpass.js +2 -1
- package/dist/render/objectcolorpass.js.map +1 -1
- package/dist/render/render_queue.js +72 -52
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderbundle_wrapper.js +79 -0
- package/dist/render/renderbundle_wrapper.js.map +1 -1
- package/dist/render/renderer.js +75 -36
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/renderpass.js +16 -13
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/shadowmap_pass.js +6 -0
- package/dist/render/shadowmap_pass.js.map +1 -1
- package/dist/render/sky.js +12 -13
- package/dist/render/sky.js.map +1 -1
- package/dist/render/watermesh.js +94 -828
- package/dist/render/watermesh.js.map +1 -1
- package/dist/render/wavegenerator.js +8 -0
- package/dist/render/wavegenerator.js.map +1 -0
- package/dist/scene/batchgroup.js +60 -14
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +2 -2
- package/dist/scene/graph_node.js +0 -5
- package/dist/scene/graph_node.js.map +1 -1
- package/dist/scene/light.js +5 -5
- package/dist/scene/mesh.js +34 -18
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/octree.js +5 -2
- package/dist/scene/octree.js.map +1 -1
- package/dist/scene/raycast_visitor.js +4 -2
- package/dist/scene/raycast_visitor.js.map +1 -1
- package/dist/scene/scene.js +1 -1
- package/dist/scene/scene_node.js +9 -5
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain/grass.js +3 -4
- package/dist/scene/terrain/grass.js.map +1 -1
- package/dist/scene/terrain/heightfield.js +135 -53
- package/dist/scene/terrain/heightfield.js.map +1 -1
- package/dist/scene/terrain/patch.js +3 -4
- package/dist/scene/terrain/patch.js.map +1 -1
- package/dist/scene/terrain/terrain.js +1 -1
- package/dist/scene/xform.js +7 -9
- package/dist/scene/xform.js.map +1 -1
- package/dist/shaders/misc.js +10 -1
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +81 -16
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/shadow.js +1 -9
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/ssr.js +442 -0
- package/dist/{material/terrainmat.js.map → shaders/ssr.js.map} +1 -1
- package/dist/shaders/water.js +377 -250
- package/dist/shaders/water.js.map +1 -1
- package/dist/shadow/shadowmapper.js +11 -11
- package/dist/shapes/cylinder.js +6 -5
- package/dist/shapes/cylinder.js.map +1 -1
- package/dist/utility/bounding_volume.js +1 -53
- package/dist/utility/bounding_volume.js.map +1 -1
- package/dist/utility/misc.js +93 -0
- package/dist/utility/misc.js.map +1 -0
- package/dist/utility/shprojection.js +2 -7
- package/dist/utility/shprojection.js.map +1 -1
- package/dist/utility/textures/ggxlut.js +213 -0
- package/dist/utility/textures/ggxlut.js.map +1 -0
- package/dist/utility/textures/gradientnoise.js +61 -0
- package/dist/utility/textures/gradientnoise.js.map +1 -0
- package/dist/utility/textures/randomnoise.js +41 -0
- package/dist/utility/textures/randomnoise.js.map +1 -0
- package/dist/values.js +8 -1
- package/dist/values.js.map +1 -1
- package/package.json +4 -8
- package/dist/animation/usertrack.js +0 -47
- package/dist/animation/usertrack.js.map +0 -1
- package/dist/material/grassmat.js +0 -127
- package/dist/material/grassmat.js.map +0 -1
- package/dist/material/lightmodel.js +0 -2074
- package/dist/material/lightmodel.js.map +0 -1
- package/dist/material/lit.js +0 -578
- package/dist/material/mixins/pbr/metallicroughness.js +0 -126
- package/dist/material/mixins/pbr/metallicroughness.js.map +0 -1
- package/dist/material/mixins/pbr/specularglossness.js +0 -104
- package/dist/material/mixins/pbr/specularglossness.js.map +0 -1
- package/dist/material/pbr.js +0 -27
- package/dist/material/pbr.js.map +0 -1
- package/dist/material/standard.js +0 -282
- package/dist/material/terrainlightmodel.js +0 -259
- package/dist/material/terrainmat.js +0 -357
- package/dist/render/depth_pass.js +0 -47
- package/dist/render/depth_pass.js.map +0 -1
- package/dist/render/forward.js +0 -186
- package/dist/render/forward.js.map +0 -1
- package/dist/render/forward_pass.js +0 -137
- package/dist/render/forward_pass.js.map +0 -1
- package/dist/render/helper.js +0 -38
- package/dist/render/helper.js.map +0 -1
- package/dist/render/objectpool.js +0 -295
- package/dist/render/objectpool.js.map +0 -1
- package/dist/render/renderscheme.js +0 -61
- package/dist/render/renderscheme.js.map +0 -1
- package/dist/render/temporalcache.js +0 -222
- package/dist/scene/model.js +0 -111
- package/dist/scene/model.js.map +0 -1
- package/dist/scene/octree_update_visitor.js +0 -20
- package/dist/scene/octree_update_visitor.js.map +0 -1
- package/dist/shaders/builtins.js +0 -110
- package/dist/shaders/builtins.js.map +0 -1
- package/dist/shaders/framework.js +0 -723
- package/dist/shaders/lighting.js +0 -335
- package/dist/shaders/lighting.js.map +0 -1
- package/dist/utility/sheenlut.js +0 -196
- 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
|
|
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
|
|
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,
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/material/blinn.js
CHANGED
|
@@ -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
|
-
|
|
59
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/material/lambert.js
CHANGED
|
@@ -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.
|
|
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)}:${
|
|
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,
|
|
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
|
|
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[
|
|
105
|
+
uniformsHolder[instanceIndex * 4] = Number(value);
|
|
105
106
|
Object.defineProperty(instance, prop, {
|
|
106
107
|
get () {
|
|
107
|
-
return uniformsHolder[
|
|
108
|
+
return uniformsHolder[instanceIndex * 4];
|
|
108
109
|
},
|
|
109
110
|
set (value) {
|
|
110
|
-
uniformsHolder[
|
|
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[
|
|
122
|
-
uniformsHolder[
|
|
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[
|
|
126
|
+
return new Vector2(uniformsHolder[instanceIndex * 4], uniformsHolder[instanceIndex * 4 + 1]);
|
|
126
127
|
},
|
|
127
128
|
set (value) {
|
|
128
|
-
|
|
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[
|
|
140
|
-
uniformsHolder[
|
|
141
|
-
uniformsHolder[
|
|
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[
|
|
149
|
+
return new Vector3(uniformsHolder[instanceIndex * 4], uniformsHolder[instanceIndex * 4 + 1], uniformsHolder[instanceIndex * 4 + 2]);
|
|
145
150
|
},
|
|
146
151
|
set (value) {
|
|
147
|
-
|
|
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[
|
|
159
|
-
uniformsHolder[
|
|
160
|
-
uniformsHolder[
|
|
161
|
-
uniformsHolder[
|
|
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[
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 (
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.$
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|