@zephyr3d/scene 0.7.1 → 0.8.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 (74) hide show
  1. package/dist/animation/animation.js +0 -18
  2. package/dist/animation/animation.js.map +1 -1
  3. package/dist/animation/animationset.js +2 -2
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/ik/ccd_solver.js +372 -0
  6. package/dist/animation/ik/ccd_solver.js.map +1 -0
  7. package/dist/animation/ik/fabrik_solver.js +399 -0
  8. package/dist/animation/ik/fabrik_solver.js.map +1 -0
  9. package/dist/animation/ik/ik_angle_constraint.js +181 -0
  10. package/dist/animation/ik/ik_angle_constraint.js.map +1 -0
  11. package/dist/animation/ik/ik_chain.js +163 -0
  12. package/dist/animation/ik/ik_chain.js.map +1 -0
  13. package/dist/animation/ik/ik_chain_builder.js +68 -0
  14. package/dist/animation/ik/ik_chain_builder.js.map +1 -0
  15. package/dist/animation/ik/ik_constraint.js +25 -0
  16. package/dist/animation/ik/ik_constraint.js.map +1 -0
  17. package/dist/animation/ik/ik_pole_constraint.js +123 -0
  18. package/dist/animation/ik/ik_pole_constraint.js.map +1 -0
  19. package/dist/animation/ik/ik_solver.js +48 -0
  20. package/dist/animation/ik/ik_solver.js.map +1 -0
  21. package/dist/animation/ik/ik_track.js +96 -0
  22. package/dist/animation/ik/ik_track.js.map +1 -0
  23. package/dist/animation/ik/ik_utils.js +270 -0
  24. package/dist/animation/ik/ik_utils.js.map +1 -0
  25. package/dist/animation/ik/two_bone_ik_solver.js +332 -0
  26. package/dist/animation/ik/two_bone_ik_solver.js.map +1 -0
  27. package/dist/animation/ik_modifier.js +61 -0
  28. package/dist/animation/ik_modifier.js.map +1 -0
  29. package/dist/animation/ik_postprocessor.js +71 -0
  30. package/dist/animation/ik_postprocessor.js.map +1 -0
  31. package/dist/animation/manual_transform_processor.js +156 -0
  32. package/dist/animation/manual_transform_processor.js.map +1 -0
  33. package/dist/animation/skeleton.js +55 -51
  34. package/dist/animation/skeleton.js.map +1 -1
  35. package/dist/animation/skeleton_modifier.js +38 -0
  36. package/dist/animation/skeleton_modifier.js.map +1 -0
  37. package/dist/animation/skeleton_postprocessor.js +50 -0
  38. package/dist/animation/skeleton_postprocessor.js.map +1 -0
  39. package/dist/animation/spring/multi_chain_spring_system.js +503 -0
  40. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -0
  41. package/dist/animation/spring/spring_chain.js +103 -0
  42. package/dist/animation/spring/spring_chain.js.map +1 -0
  43. package/dist/animation/spring/spring_collider.js +247 -0
  44. package/dist/animation/spring/spring_collider.js.map +1 -0
  45. package/dist/animation/spring/spring_constraint.js +21 -0
  46. package/dist/animation/spring/spring_constraint.js.map +1 -0
  47. package/dist/animation/spring/spring_particle.js +20 -0
  48. package/dist/animation/spring/spring_particle.js.map +1 -0
  49. package/dist/animation/spring/spring_system.js +526 -0
  50. package/dist/animation/spring/spring_system.js.map +1 -0
  51. package/dist/animation/spring_modifier.js +45 -0
  52. package/dist/animation/spring_modifier.js.map +1 -0
  53. package/dist/animation/spring_postprocessor.js +54 -0
  54. package/dist/animation/spring_postprocessor.js.map +1 -0
  55. package/dist/app/screen.js +1 -1
  56. package/dist/app/screen.js.map +1 -1
  57. package/dist/asset/model.js +8 -4
  58. package/dist/asset/model.js.map +1 -1
  59. package/dist/camera/perspectivecamera.js +3 -3
  60. package/dist/camera/perspectivecamera.js.map +1 -1
  61. package/dist/index.d.ts +1385 -4
  62. package/dist/index.js +16 -0
  63. package/dist/index.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/blinnphong.js +66 -4
  65. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  66. package/dist/material/shader/helper.js +5 -3
  67. package/dist/material/shader/helper.js.map +1 -1
  68. package/dist/scene/mesh.js +15 -23
  69. package/dist/scene/mesh.js.map +1 -1
  70. package/dist/utility/serialization/scene/animation.js +21 -20
  71. package/dist/utility/serialization/scene/animation.js.map +1 -1
  72. package/dist/utility/serialization/scene/material.js +62 -0
  73. package/dist/utility/serialization/scene/material.js.map +1 -1
  74. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -100,6 +100,22 @@ export { NodeScaleTrack } from './animation/scaletrack.js';
100
100
  export { PropertyTrack } from './animation/proptrack.js';
101
101
  export { MorphTargetTrack } from './animation/morphtrack.js';
102
102
  export { Skeleton } from './animation/skeleton.js';
103
+ export { SkeletonModifier } from './animation/skeleton_modifier.js';
104
+ export { IKModifier } from './animation/ik_modifier.js';
105
+ export { SpringModifier } from './animation/spring_modifier.js';
106
+ export { IKChain } from './animation/ik/ik_chain.js';
107
+ export { IKSolver } from './animation/ik/ik_solver.js';
108
+ export { FABRIKSolver } from './animation/ik/fabrik_solver.js';
109
+ export { TwoBoneIKSolver } from './animation/ik/two_bone_ik_solver.js';
110
+ export { CCDSolver } from './animation/ik/ccd_solver.js';
111
+ export { IKConstraint } from './animation/ik/ik_constraint.js';
112
+ export { IKAngleConstraint } from './animation/ik/ik_angle_constraint.js';
113
+ export { createSpringParticle } from './animation/spring/spring_particle.js';
114
+ export { createSpringConstraint } from './animation/spring/spring_constraint.js';
115
+ export { SpringChain } from './animation/spring/spring_chain.js';
116
+ export { SpringSystem } from './animation/spring/spring_system.js';
117
+ export { MultiChainSpringSystem } from './animation/spring/multi_chain_spring_system.js';
118
+ export { createCapsuleCollider, createPlaneCollider, createSphereCollider, resolveCapsuleCollision, resolvePlaneCollision, resolveSphereCollision, updateColliderFromNode } from './animation/spring/spring_collider.js';
103
119
  export { Camera } from './camera/camera.js';
104
120
  export { OrthoCamera } from './camera/orthocamera.js';
105
121
  export { PerspectiveCamera } from './camera/perspectivecamera.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,6 +2,7 @@ import { applyMaterialMixins } from '../../meshmaterial.js';
2
2
  import { mixinLight } from '../lit.js';
3
3
  import { ShaderHelper } from '../../shader/helper.js';
4
4
  import { MaterialVaryingFlags } from '../../../values.js';
5
+ import { Vector4 } from '@zephyr3d/base';
5
6
 
6
7
  /**
7
8
  * Blinn-phong lighting model mixin
@@ -14,16 +15,27 @@ import { MaterialVaryingFlags } from '../../../values.js';
14
15
  }
15
16
  const S = applyMaterialMixins(BaseCls, mixinLight);
16
17
  const SHININESS_UNIFORM = S.defineInstanceUniform('shininess', 'float', 'Shininess');
17
- return class extends S {
18
+ let FEATURE_WRAP_LIGHTING = 0;
19
+ const cls = class extends S {
18
20
  static blinnPhongMixed = true;
19
21
  _shininess;
22
+ _wrap;
23
+ _scatterWidth;
24
+ _scatterColor;
20
25
  constructor(){
21
26
  super();
22
27
  this._shininess = 32;
28
+ this._wrap = 0;
29
+ this._scatterWidth = 0.3;
30
+ this._scatterColor = Vector4.zero();
31
+ this.useFeature(FEATURE_WRAP_LIGHTING, false);
23
32
  }
24
33
  copyFrom(other) {
25
34
  super.copyFrom(other);
26
35
  this.shininess = other.shininess;
36
+ this.scatterWrap = other.scatterWrap;
37
+ this.scatterColor = other.scatterColor;
38
+ this.scatterWidth = other.scatterWidth;
27
39
  }
28
40
  /** Shininess */ get shininess() {
29
41
  return this._shininess;
@@ -34,6 +46,34 @@ import { MaterialVaryingFlags } from '../../../values.js';
34
46
  this.uniformChanged();
35
47
  }
36
48
  }
49
+ /** Wrap */ get scatterWrap() {
50
+ return this._wrap;
51
+ }
52
+ set scatterWrap(wrap) {
53
+ if (this._wrap !== wrap) {
54
+ this._wrap = wrap;
55
+ this.uniformChanged();
56
+ this.useFeature(FEATURE_WRAP_LIGHTING, this._wrap !== 0);
57
+ }
58
+ }
59
+ /** Scatter color */ get scatterColor() {
60
+ return this._scatterColor;
61
+ }
62
+ set scatterColor(color) {
63
+ if (!color.equalsTo(this._scatterColor)) {
64
+ this._scatterColor.set(color);
65
+ this.uniformChanged();
66
+ }
67
+ }
68
+ /** Scatter width */ get scatterWidth() {
69
+ return this._scatterWidth;
70
+ }
71
+ set scatterWidth(val) {
72
+ if (val !== this._scatterWidth) {
73
+ this._scatterWidth = val;
74
+ this.uniformChanged();
75
+ }
76
+ }
37
77
  vertexShader(scope) {
38
78
  super.vertexShader(scope);
39
79
  if (this.needFragmentColor() && this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING) {
@@ -45,12 +85,22 @@ import { MaterialVaryingFlags } from '../../../values.js';
45
85
  const pb = scope.$builder;
46
86
  if (this.needFragmentColor() && !(this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING)) {
47
87
  scope.zShininess = pb.float().uniform(2);
88
+ if (this.featureUsed(FEATURE_WRAP_LIGHTING)) {
89
+ scope.zScatterWrap = pb.float().uniform(2);
90
+ scope.zScatterWidth = pb.float().uniform(2);
91
+ scope.zScatterColor = pb.vec4().uniform(2);
92
+ }
48
93
  }
49
94
  }
50
95
  applyUniformValues(bindGroup, ctx, pass) {
51
96
  super.applyUniformValues(bindGroup, ctx, pass);
52
97
  if (this.needFragmentColor(ctx) && !(ctx.materialFlags & MaterialVaryingFlags.INSTANCING)) {
53
98
  bindGroup.setValue('zShininess', this._shininess);
99
+ if (this.featureUsed(FEATURE_WRAP_LIGHTING)) {
100
+ bindGroup.setValue('zScatterWrap', this._wrap);
101
+ bindGroup.setValue('zScatterWidth', this._scatterWidth);
102
+ bindGroup.setValue('zScatterColor', this._scatterColor);
103
+ }
54
104
  }
55
105
  }
56
106
  blinnPhongLight(scope, worldPos, normal, viewVec, albedo, outRoughness) {
@@ -79,12 +129,22 @@ import { MaterialVaryingFlags } from '../../../values.js';
79
129
  that.forEachLight(this, function(type, posRange, dirCutoff, colorIntensity, shadow) {
80
130
  this.$l.lightAtten = that.calculateLightAttenuation(this, type, this.worldPos, posRange, dirCutoff);
81
131
  this.$l.lightDir = that.calculateLightDirection(this, type, this.worldPos, posRange, dirCutoff);
82
- this.$l.NoL = pb.clamp(pb.dot(this.normal, this.lightDir), 0, 1);
132
+ this.$l.NoL = pb.dot(this.normal, this.lightDir);
83
133
  this.$l.halfVec = pb.normalize(pb.add(this.viewVec, this.lightDir));
84
134
  this.$l.NoH = pb.clamp(pb.dot(this.normal, this.halfVec), 0, 1);
85
135
  this.$l.lightColor = pb.mul(colorIntensity.rgb, colorIntensity.a, this.lightAtten);
86
- this.$l.diffuse = pb.mul(this.lightColor, 1 / Math.PI, this.NoL);
87
- this.$l.specular = pb.mul(this.lightColor, pb.pow(this.NoH, shininess));
136
+ if (that.featureUsed(FEATURE_WRAP_LIGHTING)) {
137
+ this.$l.NoLwrap = pb.div(pb.add(this.NoL, this.zScatterWrap), pb.add(1, this.zScatterWrap));
138
+ this.$l.diff = pb.max(this.NoLwrap, 0);
139
+ this.$l.scatter = pb.mul(pb.smoothStep(0, this.zScatterWidth, this.NoLwrap), pb.smoothStep(pb.mul(this.zScatterWidth, 2), this.zScatterWidth, this.NoLwrap));
140
+ this.$l.spec = this.$choice(pb.lessThanEqual(this.NoLwrap, 0), pb.float(0), pb.pow(this.NoH, shininess));
141
+ this.$l.diffuse = pb.mul(this.lightColor, 1 / Math.PI, pb.add(pb.vec3(this.diff), pb.mul(this.zScatterColor.rgb, this.scatter)));
142
+ this.$l.specular = pb.mul(this.lightColor, this.spec);
143
+ } else {
144
+ this.NoL = pb.clamp(this.NoL, 0, 1);
145
+ this.$l.diffuse = pb.mul(this.lightColor, 1 / Math.PI, this.NoL);
146
+ this.$l.specular = pb.mul(this.lightColor, pb.pow(this.NoH, shininess));
147
+ }
88
148
  if (shadow) {
89
149
  this.$if(pb.greaterThan(this.NoL, 0), function() {
90
150
  this.$l.shadow = pb.vec3(that.calculateShadow(this, this.worldPos, this.NoL));
@@ -106,6 +166,8 @@ import { MaterialVaryingFlags } from '../../../values.js';
106
166
  return outRoughness ? pb.getGlobalScope()[funcName](worldPos, normal, viewVec, albedo, outRoughness) : pb.getGlobalScope()[funcName](worldPos, normal, viewVec, albedo);
107
167
  }
108
168
  };
169
+ FEATURE_WRAP_LIGHTING = cls.defineFeature();
170
+ return cls;
109
171
  }
110
172
 
111
173
  export { mixinBlinnPhong };
@@ -1 +1 @@
1
- {"version":3,"file":"blinnphong.js","sources":["../../../../src/material/mixins/lightmodel/blinnphong.ts"],"sourcesContent":["import type { BindGroup, PBFunctionScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport type { MeshMaterial } from '../../meshmaterial';\r\nimport { applyMaterialMixins } from '../../meshmaterial';\r\nimport type { IMixinLight } from '../lit';\r\nimport { mixinLight } from '../lit';\r\nimport type { DrawContext } from '../../../render';\r\nimport { ShaderHelper } from '../../shader/helper';\r\nimport { MaterialVaryingFlags } from '../../../values';\r\n\r\n/**\r\n * Interface for blinn-phong lighting model mixin\r\n * @public\r\n */\r\nexport type IMixinBlinnPhong = {\r\n shininess: number;\r\n blinnPhongLight(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n normal: PBShaderExp,\r\n viewVec: PBShaderExp,\r\n albedo: PBShaderExp,\r\n outRoughness?: PBShaderExp\r\n ): PBShaderExp;\r\n} & IMixinLight;\r\n\r\n/**\r\n * Blinn-phong lighting model mixin\r\n * @param BaseCls - Class to mix in\r\n * @returns Mixed class\r\n * @public\r\n */\r\nexport function mixinBlinnPhong<T extends typeof MeshMaterial>(BaseCls: T) {\r\n if ((BaseCls as any).blinnPhongMixed) {\r\n return BaseCls as T & { new (...args: any[]): IMixinBlinnPhong };\r\n }\r\n const S = applyMaterialMixins(BaseCls, mixinLight);\r\n const SHININESS_UNIFORM = S.defineInstanceUniform('shininess', 'float', 'Shininess');\r\n return class extends S {\r\n protected static blinnPhongMixed = true;\r\n private _shininess: number;\r\n constructor() {\r\n super();\r\n this._shininess = 32;\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this.shininess = other.shininess;\r\n }\r\n /** Shininess */\r\n get shininess() {\r\n return this._shininess;\r\n }\r\n set shininess(val) {\r\n if (val !== this._shininess) {\r\n this._shininess = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n if (this.needFragmentColor() && this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING) {\r\n scope.$outputs.zShininess = this.getInstancedUniform(scope, SHININESS_UNIFORM);\r\n }\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n if (this.needFragmentColor() && !(this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING)) {\r\n scope.zShininess = pb.float().uniform(2);\r\n }\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n if (this.needFragmentColor(ctx) && !(ctx.materialFlags & MaterialVaryingFlags.INSTANCING)) {\r\n bindGroup.setValue('zShininess', this._shininess);\r\n }\r\n }\r\n blinnPhongLight(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n normal: PBShaderExp,\r\n viewVec: PBShaderExp,\r\n albedo: PBShaderExp,\r\n outRoughness?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_blinnPhongLight';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec3('worldPos'),\r\n pb.vec3('normal'),\r\n pb.vec3('viewVec'),\r\n pb.vec4('albedo'),\r\n ...(outRoughness ? [pb.vec4('outRoughness').out()] : [])\r\n ],\r\n function () {\r\n if (!that.needFragmentColor()) {\r\n this.$return(this.albedo.rgb);\r\n } else {\r\n const shininess =\r\n that.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING\r\n ? this.$inputs.zShininess\r\n : this.zShininess;\r\n if (that.needCalculateEnvLight() && !outRoughness) {\r\n this.$l.diffuseColor = that.getEnvLightIrradiance(this, this.normal);\r\n } else {\r\n this.$l.diffuseColor = pb.vec3(0);\r\n }\r\n this.$l.specularColor = pb.vec3(0);\r\n that.forEachLight(this, function (type, posRange, dirCutoff, colorIntensity, shadow) {\r\n this.$l.lightAtten = that.calculateLightAttenuation(\r\n this,\r\n type,\r\n this.worldPos,\r\n posRange,\r\n dirCutoff\r\n );\r\n this.$l.lightDir = that.calculateLightDirection(this, type, this.worldPos, posRange, dirCutoff);\r\n this.$l.NoL = pb.clamp(pb.dot(this.normal, this.lightDir), 0, 1);\r\n this.$l.halfVec = pb.normalize(pb.add(this.viewVec, this.lightDir));\r\n this.$l.NoH = pb.clamp(pb.dot(this.normal, this.halfVec), 0, 1);\r\n this.$l.lightColor = pb.mul(colorIntensity.rgb, colorIntensity.a, this.lightAtten);\r\n this.$l.diffuse = pb.mul(this.lightColor, 1 / Math.PI, this.NoL);\r\n this.$l.specular = pb.mul(this.lightColor, pb.pow(this.NoH, shininess));\r\n if (shadow) {\r\n this.$if(pb.greaterThan(this.NoL, 0), function () {\r\n this.$l.shadow = pb.vec3(that.calculateShadow(this, this.worldPos, this.NoL));\r\n this.diffuse = pb.mul(this.diffuse, this.shadow);\r\n this.specular = pb.mul(this.specular, this.shadow);\r\n });\r\n }\r\n this.diffuseColor = pb.add(this.diffuseColor, this.diffuse);\r\n this.specularColor = pb.add(this.specularColor, this.specular);\r\n });\r\n this.$l.litColor = pb.add(pb.mul(this.albedo.rgb, this.diffuseColor), this.specularColor);\r\n if (outRoughness) {\r\n this.$l.roughness = pb.sqrt(pb.div(2, pb.add(shininess, 2)));\r\n this.outRoughness = pb.vec4(\r\n pb.mul(this.albedo.rgb, pb.sub(1, this.roughness)),\r\n pb.mul(this.roughness, ShaderHelper.getCameraRoughnessFactor(this))\r\n );\r\n }\r\n this.$return(this.litColor);\r\n }\r\n }\r\n );\r\n return (\r\n outRoughness\r\n ? pb.getGlobalScope()[funcName](worldPos, normal, viewVec, albedo, outRoughness)\r\n : pb.getGlobalScope()[funcName](worldPos, normal, viewVec, albedo)\r\n ) as PBShaderExp;\r\n }\r\n } as unknown as T & { new (...args: any[]): IMixinBlinnPhong };\r\n}\r\n"],"names":["mixinBlinnPhong","BaseCls","blinnPhongMixed","S","applyMaterialMixins","mixinLight","SHININESS_UNIFORM","defineInstanceUniform","_shininess","copyFrom","other","shininess","val","uniformChanged","vertexShader","scope","needFragmentColor","drawContext","materialFlags","MaterialVaryingFlags","INSTANCING","$outputs","zShininess","getInstancedUniform","fragmentShader","pb","$builder","float","uniform","applyUniformValues","bindGroup","ctx","pass","setValue","blinnPhongLight","worldPos","normal","viewVec","albedo","outRoughness","funcName","that","func","vec3","vec4","out","$return","rgb","$inputs","needCalculateEnvLight","$l","diffuseColor","getEnvLightIrradiance","specularColor","forEachLight","type","posRange","dirCutoff","colorIntensity","shadow","lightAtten","calculateLightAttenuation","lightDir","calculateLightDirection","NoL","clamp","dot","halfVec","normalize","add","NoH","lightColor","mul","a","diffuse","Math","PI","specular","pow","$if","greaterThan","calculateShadow","litColor","roughness","sqrt","div","sub","ShaderHelper","getCameraRoughnessFactor","getGlobalScope"],"mappings":"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"}
1
+ {"version":3,"file":"blinnphong.js","sources":["../../../../src/material/mixins/lightmodel/blinnphong.ts"],"sourcesContent":["import type { BindGroup, PBFunctionScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport type { MeshMaterial } from '../../meshmaterial';\r\nimport { applyMaterialMixins } from '../../meshmaterial';\r\nimport type { IMixinLight } from '../lit';\r\nimport { mixinLight } from '../lit';\r\nimport type { DrawContext } from '../../../render';\r\nimport { ShaderHelper } from '../../shader/helper';\r\nimport { MaterialVaryingFlags } from '../../../values';\r\nimport type { Immutable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Interface for blinn-phong lighting model mixin\r\n * @public\r\n */\r\nexport type IMixinBlinnPhong = {\r\n shininess: number;\r\n scatterWrap: number;\r\n scatterWidth: number;\r\n scatterColor: Vector4;\r\n blinnPhongLight(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n normal: PBShaderExp,\r\n viewVec: PBShaderExp,\r\n albedo: PBShaderExp,\r\n outRoughness?: PBShaderExp\r\n ): PBShaderExp;\r\n} & IMixinLight;\r\n\r\n/**\r\n * Blinn-phong lighting model mixin\r\n * @param BaseCls - Class to mix in\r\n * @returns Mixed class\r\n * @public\r\n */\r\nexport function mixinBlinnPhong<T extends typeof MeshMaterial>(BaseCls: T) {\r\n if ((BaseCls as any).blinnPhongMixed) {\r\n return BaseCls as T & { new (...args: any[]): IMixinBlinnPhong };\r\n }\r\n const S = applyMaterialMixins(BaseCls, mixinLight);\r\n const SHININESS_UNIFORM = S.defineInstanceUniform('shininess', 'float', 'Shininess');\r\n let FEATURE_WRAP_LIGHTING = 0;\r\n const cls = class extends S implements IMixinBlinnPhong {\r\n protected static blinnPhongMixed = true;\r\n private _shininess: number;\r\n private _wrap: number;\r\n private _scatterWidth: number;\r\n private _scatterColor: Vector4;\r\n constructor() {\r\n super();\r\n this._shininess = 32;\r\n this._wrap = 0;\r\n this._scatterWidth = 0.3;\r\n this._scatterColor = Vector4.zero();\r\n this.useFeature(FEATURE_WRAP_LIGHTING, false);\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this.shininess = other.shininess;\r\n this.scatterWrap = other.scatterWrap;\r\n this.scatterColor = other.scatterColor;\r\n this.scatterWidth = other.scatterWidth;\r\n }\r\n /** Shininess */\r\n get shininess() {\r\n return this._shininess;\r\n }\r\n set shininess(val) {\r\n if (val !== this._shininess) {\r\n this._shininess = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Wrap */\r\n get scatterWrap() {\r\n return this._wrap;\r\n }\r\n set scatterWrap(wrap) {\r\n if (this._wrap !== wrap) {\r\n this._wrap = wrap;\r\n this.uniformChanged();\r\n this.useFeature(FEATURE_WRAP_LIGHTING, this._wrap !== 0);\r\n }\r\n }\r\n /** Scatter color */\r\n get scatterColor(): Immutable<Vector4> {\r\n return this._scatterColor;\r\n }\r\n set scatterColor(color: Immutable<Vector4>) {\r\n if (!color.equalsTo(this._scatterColor)) {\r\n this._scatterColor.set(color);\r\n this.uniformChanged();\r\n }\r\n }\r\n /** Scatter width */\r\n get scatterWidth() {\r\n return this._scatterWidth;\r\n }\r\n set scatterWidth(val) {\r\n if (val !== this._scatterWidth) {\r\n this._scatterWidth = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n if (this.needFragmentColor() && this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING) {\r\n scope.$outputs.zShininess = this.getInstancedUniform(scope, SHININESS_UNIFORM);\r\n }\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n if (this.needFragmentColor() && !(this.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING)) {\r\n scope.zShininess = pb.float().uniform(2);\r\n if (this.featureUsed(FEATURE_WRAP_LIGHTING)) {\r\n scope.zScatterWrap = pb.float().uniform(2);\r\n scope.zScatterWidth = pb.float().uniform(2);\r\n scope.zScatterColor = pb.vec4().uniform(2);\r\n }\r\n }\r\n }\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n if (this.needFragmentColor(ctx) && !(ctx.materialFlags & MaterialVaryingFlags.INSTANCING)) {\r\n bindGroup.setValue('zShininess', this._shininess);\r\n if (this.featureUsed(FEATURE_WRAP_LIGHTING)) {\r\n bindGroup.setValue('zScatterWrap', this._wrap);\r\n bindGroup.setValue('zScatterWidth', this._scatterWidth);\r\n bindGroup.setValue('zScatterColor', this._scatterColor);\r\n }\r\n }\r\n }\r\n blinnPhongLight(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n normal: PBShaderExp,\r\n viewVec: PBShaderExp,\r\n albedo: PBShaderExp,\r\n outRoughness?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_blinnPhongLight';\r\n const that = this;\r\n pb.func(\r\n funcName,\r\n [\r\n pb.vec3('worldPos'),\r\n pb.vec3('normal'),\r\n pb.vec3('viewVec'),\r\n pb.vec4('albedo'),\r\n ...(outRoughness ? [pb.vec4('outRoughness').out()] : [])\r\n ],\r\n function () {\r\n if (!that.needFragmentColor()) {\r\n this.$return(this.albedo.rgb);\r\n } else {\r\n const shininess =\r\n that.drawContext.materialFlags & MaterialVaryingFlags.INSTANCING\r\n ? this.$inputs.zShininess\r\n : this.zShininess;\r\n if (that.needCalculateEnvLight() && !outRoughness) {\r\n this.$l.diffuseColor = that.getEnvLightIrradiance(this, this.normal);\r\n } else {\r\n this.$l.diffuseColor = pb.vec3(0);\r\n }\r\n this.$l.specularColor = pb.vec3(0);\r\n that.forEachLight(this, function (type, posRange, dirCutoff, colorIntensity, shadow) {\r\n this.$l.lightAtten = that.calculateLightAttenuation(\r\n this,\r\n type,\r\n this.worldPos,\r\n posRange,\r\n dirCutoff\r\n );\r\n this.$l.lightDir = that.calculateLightDirection(this, type, this.worldPos, posRange, dirCutoff);\r\n this.$l.NoL = pb.dot(this.normal, this.lightDir);\r\n this.$l.halfVec = pb.normalize(pb.add(this.viewVec, this.lightDir));\r\n this.$l.NoH = pb.clamp(pb.dot(this.normal, this.halfVec), 0, 1);\r\n this.$l.lightColor = pb.mul(colorIntensity.rgb, colorIntensity.a, this.lightAtten);\r\n if (that.featureUsed(FEATURE_WRAP_LIGHTING)) {\r\n this.$l.NoLwrap = pb.div(pb.add(this.NoL, this.zScatterWrap), pb.add(1, this.zScatterWrap));\r\n this.$l.diff = pb.max(this.NoLwrap, 0);\r\n this.$l.scatter = pb.mul(\r\n pb.smoothStep(0, this.zScatterWidth, this.NoLwrap),\r\n pb.smoothStep(pb.mul(this.zScatterWidth, 2), this.zScatterWidth, this.NoLwrap)\r\n );\r\n this.$l.spec = this.$choice(\r\n pb.lessThanEqual(this.NoLwrap, 0),\r\n pb.float(0),\r\n pb.pow(this.NoH, shininess)\r\n );\r\n this.$l.diffuse = pb.mul(\r\n this.lightColor,\r\n 1 / Math.PI,\r\n pb.add(pb.vec3(this.diff), pb.mul(this.zScatterColor.rgb, this.scatter))\r\n );\r\n this.$l.specular = pb.mul(this.lightColor, this.spec);\r\n } else {\r\n this.NoL = pb.clamp(this.NoL, 0, 1);\r\n this.$l.diffuse = pb.mul(this.lightColor, 1 / Math.PI, this.NoL);\r\n this.$l.specular = pb.mul(this.lightColor, pb.pow(this.NoH, shininess));\r\n }\r\n if (shadow) {\r\n this.$if(pb.greaterThan(this.NoL, 0), function () {\r\n this.$l.shadow = pb.vec3(that.calculateShadow(this, this.worldPos, this.NoL));\r\n this.diffuse = pb.mul(this.diffuse, this.shadow);\r\n this.specular = pb.mul(this.specular, this.shadow);\r\n });\r\n }\r\n this.diffuseColor = pb.add(this.diffuseColor, this.diffuse);\r\n this.specularColor = pb.add(this.specularColor, this.specular);\r\n });\r\n this.$l.litColor = pb.add(pb.mul(this.albedo.rgb, this.diffuseColor), this.specularColor);\r\n if (outRoughness) {\r\n this.$l.roughness = pb.sqrt(pb.div(2, pb.add(shininess, 2)));\r\n this.outRoughness = pb.vec4(\r\n pb.mul(this.albedo.rgb, pb.sub(1, this.roughness)),\r\n pb.mul(this.roughness, ShaderHelper.getCameraRoughnessFactor(this))\r\n );\r\n }\r\n this.$return(this.litColor);\r\n }\r\n }\r\n );\r\n return (\r\n outRoughness\r\n ? pb.getGlobalScope()[funcName](worldPos, normal, viewVec, albedo, outRoughness)\r\n : pb.getGlobalScope()[funcName](worldPos, normal, viewVec, albedo)\r\n ) as PBShaderExp;\r\n }\r\n } as unknown as T & { new (...args: any[]): IMixinBlinnPhong };\r\n FEATURE_WRAP_LIGHTING = cls.defineFeature();\r\n return cls;\r\n}\r\n"],"names":["mixinBlinnPhong","BaseCls","blinnPhongMixed","S","applyMaterialMixins","mixinLight","SHININESS_UNIFORM","defineInstanceUniform","FEATURE_WRAP_LIGHTING","cls","_shininess","_wrap","_scatterWidth","_scatterColor","Vector4","zero","useFeature","copyFrom","other","shininess","scatterWrap","scatterColor","scatterWidth","val","uniformChanged","wrap","color","equalsTo","set","vertexShader","scope","needFragmentColor","drawContext","materialFlags","MaterialVaryingFlags","INSTANCING","$outputs","zShininess","getInstancedUniform","fragmentShader","pb","$builder","float","uniform","featureUsed","zScatterWrap","zScatterWidth","zScatterColor","vec4","applyUniformValues","bindGroup","ctx","pass","setValue","blinnPhongLight","worldPos","normal","viewVec","albedo","outRoughness","funcName","that","func","vec3","out","$return","rgb","$inputs","needCalculateEnvLight","$l","diffuseColor","getEnvLightIrradiance","specularColor","forEachLight","type","posRange","dirCutoff","colorIntensity","shadow","lightAtten","calculateLightAttenuation","lightDir","calculateLightDirection","NoL","dot","halfVec","normalize","add","NoH","clamp","lightColor","mul","a","NoLwrap","div","diff","max","scatter","smoothStep","spec","$choice","lessThanEqual","pow","diffuse","Math","PI","specular","$if","greaterThan","calculateShadow","litColor","roughness","sqrt","sub","ShaderHelper","getCameraRoughnessFactor","getGlobalScope","defineFeature"],"mappings":"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"}
@@ -1113,7 +1113,7 @@ const UNIFORM_NAME_MORPH_INFO = 'Z_UniformMorphInfo';
1113
1113
  */ static linearDepthToNonLinear(scope, depth, nearFar) {
1114
1114
  const pb = scope.$builder;
1115
1115
  nearFar = nearFar ?? this.getCameraParams(scope);
1116
- return pb.div(pb.sub(nearFar.y, pb.div(pb.mul(nearFar.x, nearFar.y), depth)), pb.sub(nearFar.y, nearFar.x));
1116
+ return pb.add(pb.mul(pb.div(pb.sub(pb.add(nearFar.x, nearFar.y), pb.div(pb.mul(nearFar.x, nearFar.y, 2), depth)), pb.sub(nearFar.y, nearFar.x)), 0.5), 0.5);
1117
1117
  }
1118
1118
  /**
1119
1119
  * Calculates the linear depth from non-linear depth
@@ -1125,7 +1125,8 @@ const UNIFORM_NAME_MORPH_INFO = 'Z_UniformMorphInfo';
1125
1125
  */ static nonLinearDepthToLinear(scope, depth, nearFar) {
1126
1126
  const pb = scope.$builder;
1127
1127
  nearFar = nearFar ?? this.getCameraParams(scope);
1128
- return pb.div(pb.mul(nearFar.x, nearFar.y), pb.mix(nearFar.y, nearFar.x, depth));
1128
+ return pb.div(pb.mul(nearFar.x, nearFar.y, 2), pb.add(nearFar.x, nearFar.y, pb.mul(pb.sub(nearFar.x, nearFar.y), pb.sub(pb.mul(depth, 2), 1))));
1129
+ //return pb.div(pb.mul(nearFar.x, nearFar.y), pb.mix(nearFar.y, nearFar.x, depth));
1129
1130
  }
1130
1131
  /**
1131
1132
  * Calculates the normalized linear depth from non-linear depth
@@ -1137,7 +1138,8 @@ const UNIFORM_NAME_MORPH_INFO = 'Z_UniformMorphInfo';
1137
1138
  */ static nonLinearDepthToLinearNormalized(scope, depth, nearFar) {
1138
1139
  const pb = scope.$builder;
1139
1140
  nearFar = nearFar ?? this.getCameraParams(scope);
1140
- return pb.div(nearFar.x, pb.mix(nearFar.y, nearFar.x, depth));
1141
+ //return pb.div(nearFar.x, pb.mix(nearFar.y, nearFar.x, depth));
1142
+ return pb.div(pb.sub(this.nonLinearDepthToLinear(scope, depth, nearFar), nearFar.x), pb.sub(nearFar.y, nearFar.x));
1141
1143
  }
1142
1144
  /**
1143
1145
  * Sample linear depth from linear depth texture