@babylonjs/gui 9.10.0 → 9.11.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 (36) hide show
  1. package/3D/materials/fluent/fluentMaterial.d.ts +12 -0
  2. package/3D/materials/fluent/fluentMaterial.js +22 -0
  3. package/3D/materials/fluent/fluentMaterial.js.map +1 -1
  4. package/3D/materials/fluent/wgsl/fluent.fragment.d.ts +5 -0
  5. package/3D/materials/fluent/wgsl/fluent.fragment.js +44 -0
  6. package/3D/materials/fluent/wgsl/fluent.fragment.js.map +1 -0
  7. package/3D/materials/fluent/wgsl/fluent.vertex.d.ts +5 -0
  8. package/3D/materials/fluent/wgsl/fluent.vertex.js +29 -0
  9. package/3D/materials/fluent/wgsl/fluent.vertex.js.map +1 -0
  10. package/3D/materials/fluentBackplate/fluentBackplateMaterial.d.ts +12 -0
  11. package/3D/materials/fluentBackplate/fluentBackplateMaterial.js +22 -0
  12. package/3D/materials/fluentBackplate/fluentBackplateMaterial.js.map +1 -1
  13. package/3D/materials/fluentBackplate/wgsl/fluentBackplate.fragment.d.ts +5 -0
  14. package/3D/materials/fluentBackplate/wgsl/fluentBackplate.fragment.js +32 -0
  15. package/3D/materials/fluentBackplate/wgsl/fluentBackplate.fragment.js.map +1 -0
  16. package/3D/materials/fluentBackplate/wgsl/fluentBackplate.vertex.d.ts +5 -0
  17. package/3D/materials/fluentBackplate/wgsl/fluentBackplate.vertex.js +72 -0
  18. package/3D/materials/fluentBackplate/wgsl/fluentBackplate.vertex.js.map +1 -0
  19. package/3D/materials/fluentButton/fluentButtonMaterial.d.ts +13 -0
  20. package/3D/materials/fluentButton/fluentButtonMaterial.js +29 -2
  21. package/3D/materials/fluentButton/fluentButtonMaterial.js.map +1 -1
  22. package/3D/materials/fluentButton/wgsl/fluentButton.fragment.d.ts +5 -0
  23. package/3D/materials/fluentButton/wgsl/fluentButton.fragment.js +20 -0
  24. package/3D/materials/fluentButton/wgsl/fluentButton.fragment.js.map +1 -0
  25. package/3D/materials/fluentButton/wgsl/fluentButton.vertex.d.ts +5 -0
  26. package/3D/materials/fluentButton/wgsl/fluentButton.vertex.js +31 -0
  27. package/3D/materials/fluentButton/wgsl/fluentButton.vertex.js.map +1 -0
  28. package/3D/materials/handle/handleMaterial.js +7 -0
  29. package/3D/materials/handle/handleMaterial.js.map +1 -1
  30. package/3D/materials/handle/wgsl/handle.fragment.d.ts +5 -0
  31. package/3D/materials/handle/wgsl/handle.fragment.js +13 -0
  32. package/3D/materials/handle/wgsl/handle.fragment.js.map +1 -0
  33. package/3D/materials/handle/wgsl/handle.vertex.d.ts +5 -0
  34. package/3D/materials/handle/wgsl/handle.vertex.js +13 -0
  35. package/3D/materials/handle/wgsl/handle.vertex.js.map +1 -0
  36. package/package.json +2 -2
@@ -0,0 +1,72 @@
1
+ // Do not edit.
2
+ import { ShaderStore } from "@babylonjs/core/Engines/shaderStore.js";
3
+ const name = "fluentBackplateVertexShader";
4
+ const shader = `uniform world: mat4x4f;uniform viewProjection: mat4x4f;uniform cameraPosition: vec3f;attribute position: vec3f;attribute normal: vec3f;
5
+ #ifdef TANGENT
6
+ attribute tangent: vec3f;
7
+ #endif
8
+ uniform _Radius_: f32;uniform _Line_Width_: f32;uniform _Absolute_Sizes_: f32;uniform _Filter_Width_: f32;uniform _Radius_Top_Left_: f32;uniform _Radius_Top_Right_: f32;uniform _Radius_Bottom_Left_: f32;uniform _Radius_Bottom_Right_: f32;uniform _Blob_Position_: vec3f;uniform _Blob_Intensity_: f32;uniform _Blob_Near_Size_: f32;uniform _Blob_Far_Size_: f32;uniform _Blob_Near_Distance_: f32;uniform _Blob_Far_Distance_: f32;uniform _Blob_Fade_Length_: f32;uniform _Blob_Pulse_: f32;uniform _Blob_Fade_: f32;uniform _Blob_Position_2_: vec3f;uniform _Blob_Near_Size_2_: f32;uniform _Blob_Pulse_2_: f32;uniform _Blob_Fade_2_: f32;uniform _Rate_: f32;uniform _Highlight_Transform_: vec4f;uniform _Angle_: f32;uniform _Use_Global_Left_Index_: f32;uniform _Use_Global_Right_Index_: f32;uniform Global_Left_Index_Tip_Position: vec4f;uniform Global_Right_Index_Tip_Position: vec4f;varying vPosition: vec3f;varying vNormal: vec3f;varying vUV: vec2f;varying vTangent: vec3f;varying vBinormal: vec3f;varying vColor: vec4f;varying vExtra1: vec4f;varying vExtra2: vec4f;varying vExtra3: vec4f;fn pickDir(degrees: f32,dirX: vec3f,dirY: vec3f)->vec3f {let angle: f32=degrees*3.14159/180.0;return cos(angle)*dirX+sin(angle)*dirY;}
9
+ fn moveVerts(anisotropy: f32,p: vec3f,radius: f32)->array<vec4f,2> {let uv: vec2f=p.xy*2.0+vec2f(0.5);let center: vec2f=clamp(uv,vec2f(0.0),vec2f(1.0));let delta: vec2f=uv-center;let r2: vec2f=2.0*vec2f(radius/anisotropy,radius);let newUV: vec2f=center+r2*(uv-2.0*center+vec2f(0.5));let newP: vec3f=vec3f(newUV-vec2f(0.5),p.z);let radialGradient: f32=1.0-length(delta)*2.0;let radialDir: vec3f=vec3f(delta*r2,0.0);return array<vec4f,2>(vec4f(newP,radialGradient),vec4f(newUV,radialDir.xy));}
10
+ fn relativeOrAbsoluteDetail(nominalRadius: f32,nominalLineWidth: f32,absoluteMeasurements: f32,height: f32)->vec2f {var scale: f32=1.0;if (absoluteMeasurements>0.5) {scale=1.0/height;}
11
+ return vec2f(nominalRadius*scale,nominalLineWidth*scale);}
12
+ fn edgeAAVertex(
13
+ positionWorld: vec3f,
14
+ positionObject: vec3f,
15
+ normalObject: vec3f,
16
+ eye: vec3f,
17
+ radialGradient: f32,
18
+ tangentObject: vec3f
19
+ )->vec2f {let incident: vec3f=eye-positionWorld;let tangentWorld: vec3f=(uniforms.world*vec4f(tangentObject,0.0)).xyz;var g: f32=1.0;if (dot(tangentWorld,incident)<0.0) {g=0.0;}
20
+ if (normalObject.z==0.0) {if (positionObject.z>0.0) {return vec2f(g,1.0);}
21
+ return vec2f(1.0,g);}
22
+ return vec2f(g+(1.0-g)*radialGradient,1.0);}
23
+ fn pickRadius(radius: f32,topLeft: f32,topRight: f32,bottomLeft: f32,bottomRight: f32,positionObject: vec3f)->f32 {var result: f32;if (positionObject.x<0.0) {if (positionObject.y>0.0) {result=topLeft;} else {result=bottomLeft;}} else {if (positionObject.y>0.0) {result=topRight;} else {result=bottomRight;}}
24
+ return result*radius;}
25
+ fn blobVertex(
26
+ positionWorld: vec3f,
27
+ normalWorld: vec3f,
28
+ tangentWorld: vec3f,
29
+ binormalWorld: vec3f,
30
+ blobPosition: vec3f,
31
+ intensity: f32,
32
+ blobNearSize: f32,
33
+ blobFarSize: f32,
34
+ blobNearDistance: f32,
35
+ blobFarDistance: f32,
36
+ blobFadeLength: f32,
37
+ blobPulse: f32,
38
+ blobFade: f32
39
+ )->vec4f {let delta: vec3f=blobPosition-positionWorld;let dist: f32=dot(normalWorld,delta);let lerpValue: f32=clamp((abs(dist)-blobNearDistance)/(blobFarDistance-blobNearDistance),0.0,1.0);let fadeValue: f32=1.0-clamp((abs(dist)-blobFarDistance)/blobFadeLength,0.0,1.0);let size: f32=blobNearSize+(blobFarSize-blobNearSize)*lerpValue;let blobXY: vec2f=vec2f(dot(delta,tangentWorld),dot(delta,binormalWorld))/(0.0001+size);let fade: f32=fadeValue*intensity*blobFade;let distance: f32=(lerpValue*0.5+0.5)*(1.0-blobPulse);return vec4f(blobXY.x,blobXY.y,distance,fade);}
40
+ fn roundRectVertex(uv: vec2f,radius: f32,margin: f32,anisotropy: f32,gradient1: f32,gradient2: f32)->array<vec4f,2> {let scaleXY: vec2f=vec2f(anisotropy,1.0);let lineUV: vec2f=uv-vec2f(0.5);let rectUV: vec2f=lineUV*scaleXY;let rectParms: vec4f=vec4f(scaleXY*0.5-vec2f(radius)-vec2f(margin),gradient1,gradient2);return array<vec4f,2>(vec4f(rectUV,lineUV),rectParms);}
41
+ fn lineVertex(uv: vec2f,time: f32,rate: f32,highlightTransform: vec4f)->vec3f {let angle2: f32=(rate*time)*2.0*3.1416;let sinAngle2: f32=sin(angle2);let cosAngle2: f32=cos(angle2);let xformUV: vec2f=uv*highlightTransform.xy+highlightTransform.zw;return vec3f(0.0,cosAngle2*xformUV.x-sinAngle2*xformUV.y,0.0);}
42
+ @vertex
43
+ fn main(input: VertexInputs)->FragmentInputs {let normalWorld: vec3f=normalize((uniforms.world*vec4f(vertexInputs.normal,0.0)).xyz);let tangentWorld: vec3f=(uniforms.world*vec4f(vec3f(1.0,0.0,0.0),0.0)).xyz;let tangentLength: f32=length(tangentWorld);let tangentWorldN: vec3f=tangentWorld/tangentLength;let binormalWorld: vec3f=(uniforms.world*vec4f(vec3f(0.0,1.0,0.0),0.0)).xyz;let binormalLength: f32=length(binormalWorld);let binormalWorldN: vec3f=binormalWorld/binormalLength;let anisotropy: f32=tangentLength/binormalLength;let blobPositionLeft: vec3f=mix(uniforms._Blob_Position_,uniforms.Global_Left_Index_Tip_Position.xyz,step(0.5,uniforms._Use_Global_Left_Index_));let blobPositionRight: vec3f=mix(uniforms._Blob_Position_2_,uniforms.Global_Right_Index_Tip_Position.xyz,step(0.5,uniforms._Use_Global_Right_Index_));let radiusMultiplier: f32=pickRadius(uniforms._Radius_,uniforms._Radius_Top_Left_,uniforms._Radius_Top_Right_,uniforms._Radius_Bottom_Left_,uniforms._Radius_Bottom_Right_,vertexInputs.position);let normalDir: vec3f=pickDir(uniforms._Angle_,tangentWorldN,binormalWorldN);let detail: vec2f=relativeOrAbsoluteDetail(radiusMultiplier,uniforms._Line_Width_,uniforms._Absolute_Sizes_,binormalLength);let radius: f32=detail.x;let lineWidth: f32=detail.y;let moved: array<vec4f,2>=moveVerts(anisotropy,vertexInputs.position,radius);let newP: vec3f=moved[0].xyz;let radialGradient: f32=moved[0].w;let newUV: vec2f=moved[1].xy;let positionWorld: vec3f=(uniforms.world*vec4f(newP,1.0)).xyz;
44
+ #ifdef BLOB_ENABLE
45
+ let blobInfoLeft: vec4f=blobVertex(positionWorld,normalWorld,tangentWorldN,binormalWorldN,blobPositionLeft,uniforms._Blob_Intensity_,uniforms._Blob_Near_Size_,uniforms._Blob_Far_Size_,uniforms._Blob_Near_Distance_,uniforms._Blob_Far_Distance_,uniforms._Blob_Fade_Length_,uniforms._Blob_Pulse_,uniforms._Blob_Fade_);
46
+ #else
47
+ let blobInfoLeft: vec4f=vec4f(0.0);
48
+ #endif
49
+ #ifdef BLOB_ENABLE_2
50
+ let blobInfoRight: vec4f=blobVertex(positionWorld,normalWorld,tangentWorldN,binormalWorldN,blobPositionRight,uniforms._Blob_Intensity_,uniforms._Blob_Near_Size_2_,uniforms._Blob_Far_Size_,uniforms._Blob_Near_Distance_,uniforms._Blob_Far_Distance_,uniforms._Blob_Fade_Length_,uniforms._Blob_Pulse_2_,uniforms._Blob_Fade_2_);
51
+ #else
52
+ let blobInfoRight: vec4f=vec4f(0.0);
53
+ #endif
54
+ #ifdef TANGENT
55
+ let tangentObject: vec3f=vertexInputs.tangent;
56
+ #else
57
+ let tangentObject: vec3f=vec3f(0.0);
58
+ #endif
59
+ #ifdef SMOOTH_EDGES
60
+ let edgeGradient: vec2f=edgeAAVertex(positionWorld,vertexInputs.position,vertexInputs.normal,uniforms.cameraPosition,radialGradient,tangentObject);
61
+ #else
62
+ let edgeGradient: vec2f=vec2f(1.0);
63
+ #endif
64
+ let rectData: array<vec4f,2>=roundRectVertex(newUV,radius,0.0,anisotropy,edgeGradient.x,edgeGradient.y);let lineVx: vec3f=lineVertex(rectData[0].zw,0.0,uniforms._Rate_,uniforms._Highlight_Transform_);vertexOutputs.position=uniforms.viewProjection*vec4f(positionWorld,1.0);vertexOutputs.vPosition=positionWorld;vertexOutputs.vNormal=normalDir;vertexOutputs.vUV=rectData[0].xy;vertexOutputs.vTangent=lineVx;vertexOutputs.vBinormal=normalWorld;vertexOutputs.vColor=vec4f(radius,lineWidth,0.0,1.0);vertexOutputs.vExtra1=rectData[1];vertexOutputs.vExtra2=blobInfoLeft;vertexOutputs.vExtra3=blobInfoRight;}
65
+ `;
66
+ // Sideeffect
67
+ if (!ShaderStore.ShadersStoreWGSL[name]) {
68
+ ShaderStore.ShadersStoreWGSL[name] = shader;
69
+ }
70
+ /** @internal */
71
+ export const fluentBackplateVertexShaderWGSL = { name, shader };
72
+ //# sourceMappingURL=fluentBackplate.vertex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluentBackplate.vertex.js","sourceRoot":"","sources":["../../../../../../../dev/gui/src/3D/materials/fluentBackplate/wgsl/fluentBackplate.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,IAAI,GAAG,6BAA6B,CAAC;AAC3C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Dd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentBackplateVertexShader\";\nconst shader = `uniform world: mat4x4f;uniform viewProjection: mat4x4f;uniform cameraPosition: vec3f;attribute position: vec3f;attribute normal: vec3f;\n#ifdef TANGENT\nattribute tangent: vec3f;\n#endif\nuniform _Radius_: f32;uniform _Line_Width_: f32;uniform _Absolute_Sizes_: f32;uniform _Filter_Width_: f32;uniform _Radius_Top_Left_: f32;uniform _Radius_Top_Right_: f32;uniform _Radius_Bottom_Left_: f32;uniform _Radius_Bottom_Right_: f32;uniform _Blob_Position_: vec3f;uniform _Blob_Intensity_: f32;uniform _Blob_Near_Size_: f32;uniform _Blob_Far_Size_: f32;uniform _Blob_Near_Distance_: f32;uniform _Blob_Far_Distance_: f32;uniform _Blob_Fade_Length_: f32;uniform _Blob_Pulse_: f32;uniform _Blob_Fade_: f32;uniform _Blob_Position_2_: vec3f;uniform _Blob_Near_Size_2_: f32;uniform _Blob_Pulse_2_: f32;uniform _Blob_Fade_2_: f32;uniform _Rate_: f32;uniform _Highlight_Transform_: vec4f;uniform _Angle_: f32;uniform _Use_Global_Left_Index_: f32;uniform _Use_Global_Right_Index_: f32;uniform Global_Left_Index_Tip_Position: vec4f;uniform Global_Right_Index_Tip_Position: vec4f;varying vPosition: vec3f;varying vNormal: vec3f;varying vUV: vec2f;varying vTangent: vec3f;varying vBinormal: vec3f;varying vColor: vec4f;varying vExtra1: vec4f;varying vExtra2: vec4f;varying vExtra3: vec4f;fn pickDir(degrees: f32,dirX: vec3f,dirY: vec3f)->vec3f {let angle: f32=degrees*3.14159/180.0;return cos(angle)*dirX+sin(angle)*dirY;}\nfn moveVerts(anisotropy: f32,p: vec3f,radius: f32)->array<vec4f,2> {let uv: vec2f=p.xy*2.0+vec2f(0.5);let center: vec2f=clamp(uv,vec2f(0.0),vec2f(1.0));let delta: vec2f=uv-center;let r2: vec2f=2.0*vec2f(radius/anisotropy,radius);let newUV: vec2f=center+r2*(uv-2.0*center+vec2f(0.5));let newP: vec3f=vec3f(newUV-vec2f(0.5),p.z);let radialGradient: f32=1.0-length(delta)*2.0;let radialDir: vec3f=vec3f(delta*r2,0.0);return array<vec4f,2>(vec4f(newP,radialGradient),vec4f(newUV,radialDir.xy));}\nfn relativeOrAbsoluteDetail(nominalRadius: f32,nominalLineWidth: f32,absoluteMeasurements: f32,height: f32)->vec2f {var scale: f32=1.0;if (absoluteMeasurements>0.5) {scale=1.0/height;}\nreturn vec2f(nominalRadius*scale,nominalLineWidth*scale);}\nfn edgeAAVertex(\npositionWorld: vec3f,\npositionObject: vec3f,\nnormalObject: vec3f,\neye: vec3f,\nradialGradient: f32,\ntangentObject: vec3f\n)->vec2f {let incident: vec3f=eye-positionWorld;let tangentWorld: vec3f=(uniforms.world*vec4f(tangentObject,0.0)).xyz;var g: f32=1.0;if (dot(tangentWorld,incident)<0.0) {g=0.0;}\nif (normalObject.z==0.0) {if (positionObject.z>0.0) {return vec2f(g,1.0);}\nreturn vec2f(1.0,g);}\nreturn vec2f(g+(1.0-g)*radialGradient,1.0);}\nfn pickRadius(radius: f32,topLeft: f32,topRight: f32,bottomLeft: f32,bottomRight: f32,positionObject: vec3f)->f32 {var result: f32;if (positionObject.x<0.0) {if (positionObject.y>0.0) {result=topLeft;} else {result=bottomLeft;}} else {if (positionObject.y>0.0) {result=topRight;} else {result=bottomRight;}}\nreturn result*radius;}\nfn blobVertex(\npositionWorld: vec3f,\nnormalWorld: vec3f,\ntangentWorld: vec3f,\nbinormalWorld: vec3f,\nblobPosition: vec3f,\nintensity: f32,\nblobNearSize: f32,\nblobFarSize: f32,\nblobNearDistance: f32,\nblobFarDistance: f32,\nblobFadeLength: f32,\nblobPulse: f32,\nblobFade: f32\n)->vec4f {let delta: vec3f=blobPosition-positionWorld;let dist: f32=dot(normalWorld,delta);let lerpValue: f32=clamp((abs(dist)-blobNearDistance)/(blobFarDistance-blobNearDistance),0.0,1.0);let fadeValue: f32=1.0-clamp((abs(dist)-blobFarDistance)/blobFadeLength,0.0,1.0);let size: f32=blobNearSize+(blobFarSize-blobNearSize)*lerpValue;let blobXY: vec2f=vec2f(dot(delta,tangentWorld),dot(delta,binormalWorld))/(0.0001+size);let fade: f32=fadeValue*intensity*blobFade;let distance: f32=(lerpValue*0.5+0.5)*(1.0-blobPulse);return vec4f(blobXY.x,blobXY.y,distance,fade);}\nfn roundRectVertex(uv: vec2f,radius: f32,margin: f32,anisotropy: f32,gradient1: f32,gradient2: f32)->array<vec4f,2> {let scaleXY: vec2f=vec2f(anisotropy,1.0);let lineUV: vec2f=uv-vec2f(0.5);let rectUV: vec2f=lineUV*scaleXY;let rectParms: vec4f=vec4f(scaleXY*0.5-vec2f(radius)-vec2f(margin),gradient1,gradient2);return array<vec4f,2>(vec4f(rectUV,lineUV),rectParms);}\nfn lineVertex(uv: vec2f,time: f32,rate: f32,highlightTransform: vec4f)->vec3f {let angle2: f32=(rate*time)*2.0*3.1416;let sinAngle2: f32=sin(angle2);let cosAngle2: f32=cos(angle2);let xformUV: vec2f=uv*highlightTransform.xy+highlightTransform.zw;return vec3f(0.0,cosAngle2*xformUV.x-sinAngle2*xformUV.y,0.0);}\n@vertex\nfn main(input: VertexInputs)->FragmentInputs {let normalWorld: vec3f=normalize((uniforms.world*vec4f(vertexInputs.normal,0.0)).xyz);let tangentWorld: vec3f=(uniforms.world*vec4f(vec3f(1.0,0.0,0.0),0.0)).xyz;let tangentLength: f32=length(tangentWorld);let tangentWorldN: vec3f=tangentWorld/tangentLength;let binormalWorld: vec3f=(uniforms.world*vec4f(vec3f(0.0,1.0,0.0),0.0)).xyz;let binormalLength: f32=length(binormalWorld);let binormalWorldN: vec3f=binormalWorld/binormalLength;let anisotropy: f32=tangentLength/binormalLength;let blobPositionLeft: vec3f=mix(uniforms._Blob_Position_,uniforms.Global_Left_Index_Tip_Position.xyz,step(0.5,uniforms._Use_Global_Left_Index_));let blobPositionRight: vec3f=mix(uniforms._Blob_Position_2_,uniforms.Global_Right_Index_Tip_Position.xyz,step(0.5,uniforms._Use_Global_Right_Index_));let radiusMultiplier: f32=pickRadius(uniforms._Radius_,uniforms._Radius_Top_Left_,uniforms._Radius_Top_Right_,uniforms._Radius_Bottom_Left_,uniforms._Radius_Bottom_Right_,vertexInputs.position);let normalDir: vec3f=pickDir(uniforms._Angle_,tangentWorldN,binormalWorldN);let detail: vec2f=relativeOrAbsoluteDetail(radiusMultiplier,uniforms._Line_Width_,uniforms._Absolute_Sizes_,binormalLength);let radius: f32=detail.x;let lineWidth: f32=detail.y;let moved: array<vec4f,2>=moveVerts(anisotropy,vertexInputs.position,radius);let newP: vec3f=moved[0].xyz;let radialGradient: f32=moved[0].w;let newUV: vec2f=moved[1].xy;let positionWorld: vec3f=(uniforms.world*vec4f(newP,1.0)).xyz;\n#ifdef BLOB_ENABLE\nlet blobInfoLeft: vec4f=blobVertex(positionWorld,normalWorld,tangentWorldN,binormalWorldN,blobPositionLeft,uniforms._Blob_Intensity_,uniforms._Blob_Near_Size_,uniforms._Blob_Far_Size_,uniforms._Blob_Near_Distance_,uniforms._Blob_Far_Distance_,uniforms._Blob_Fade_Length_,uniforms._Blob_Pulse_,uniforms._Blob_Fade_);\n#else\nlet blobInfoLeft: vec4f=vec4f(0.0);\n#endif\n#ifdef BLOB_ENABLE_2\nlet blobInfoRight: vec4f=blobVertex(positionWorld,normalWorld,tangentWorldN,binormalWorldN,blobPositionRight,uniforms._Blob_Intensity_,uniforms._Blob_Near_Size_2_,uniforms._Blob_Far_Size_,uniforms._Blob_Near_Distance_,uniforms._Blob_Far_Distance_,uniforms._Blob_Fade_Length_,uniforms._Blob_Pulse_2_,uniforms._Blob_Fade_2_);\n#else\nlet blobInfoRight: vec4f=vec4f(0.0);\n#endif\n#ifdef TANGENT\nlet tangentObject: vec3f=vertexInputs.tangent;\n#else\nlet tangentObject: vec3f=vec3f(0.0);\n#endif\n#ifdef SMOOTH_EDGES\nlet edgeGradient: vec2f=edgeAAVertex(positionWorld,vertexInputs.position,vertexInputs.normal,uniforms.cameraPosition,radialGradient,tangentObject);\n#else\nlet edgeGradient: vec2f=vec2f(1.0);\n#endif\nlet rectData: array<vec4f,2>=roundRectVertex(newUV,radius,0.0,anisotropy,edgeGradient.x,edgeGradient.y);let lineVx: vec3f=lineVertex(rectData[0].zw,0.0,uniforms._Rate_,uniforms._Highlight_Transform_);vertexOutputs.position=uniforms.viewProjection*vec4f(positionWorld,1.0);vertexOutputs.vPosition=positionWorld;vertexOutputs.vNormal=normalDir;vertexOutputs.vUV=rectData[0].xy;vertexOutputs.vTangent=lineVx;vertexOutputs.vBinormal=normalWorld;vertexOutputs.vColor=vec4f(radius,lineWidth,0.0,1.0);vertexOutputs.vExtra1=rectData[1];vertexOutputs.vExtra2=blobInfoLeft;vertexOutputs.vExtra3=blobInfoRight;}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n\n/** @internal */\nexport const fluentBackplateVertexShaderWGSL = { name, shader };\n"]}
@@ -15,6 +15,7 @@ import "./shaders/fluentButton.vertex.js";
15
15
  * @since 5.0.0
16
16
  */
17
17
  export declare class FluentButtonMaterial extends PushMaterial {
18
+ private _shadersLoaded;
18
19
  /**
19
20
  * URL pointing to the texture used to define the coloring for the fluent blob effect.
20
21
  */
@@ -170,6 +171,7 @@ export declare class FluentButtonMaterial extends PushMaterial {
170
171
  */
171
172
  globalRightIndexTipPosition: Vector3;
172
173
  private _blobTexture;
174
+ private _blobTextureUrl;
173
175
  constructor(name: string, scene?: Scene);
174
176
  needAlphaBlending(): boolean;
175
177
  needAlphaTesting(): boolean;
@@ -181,9 +183,20 @@ export declare class FluentButtonMaterial extends PushMaterial {
181
183
  * @returns the list of animatables object used in the material
182
184
  */
183
185
  getAnimatables(): IAnimatable[];
186
+ /**
187
+ * Disposes the material.
188
+ * @param forceDisposeEffect specifies if effects should be forcefully disposed
189
+ */
184
190
  dispose(forceDisposeEffect?: boolean): void;
185
191
  clone(name: string): FluentButtonMaterial;
186
192
  serialize(): any;
187
193
  getClassName(): string;
194
+ /**
195
+ * Creates a fluent button material from parsed material data.
196
+ * @param source defines the JSON representation of the material
197
+ * @param scene defines the hosting scene
198
+ * @param rootUrl defines the root URL to use to load textures and relative dependencies
199
+ * @returns a new fluent button material
200
+ */
188
201
  static Parse(source: any, scene: Scene, rootUrl: string): FluentButtonMaterial;
189
202
  }
@@ -32,6 +32,7 @@ class FluentButtonMaterialDefines extends MaterialDefines {
32
32
  export class FluentButtonMaterial extends PushMaterial {
33
33
  constructor(name, scene) {
34
34
  super(name, scene);
35
+ this._shadersLoaded = false;
35
36
  /**
36
37
  * Gets or sets the width of the glowing edge, relative to the scale of the button.
37
38
  * (Default is 4% of the height).
@@ -185,8 +186,8 @@ export class FluentButtonMaterial extends PushMaterial {
185
186
  this.alphaMode = Constants.ALPHA_ADD;
186
187
  this.disableDepthWrite = true;
187
188
  this.backFaceCulling = false;
188
- const blobTextureUrl = Tools.GetAssetUrl(FluentButtonMaterial.BLOB_TEXTURE_URL);
189
- this._blobTexture = new Texture(blobTextureUrl, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);
189
+ this._blobTextureUrl = Tools.GetAssetUrl(FluentButtonMaterial.BLOB_TEXTURE_URL);
190
+ this._blobTexture = new Texture(this._blobTextureUrl, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);
190
191
  }
191
192
  needAlphaBlending() {
192
193
  return true;
@@ -210,6 +211,11 @@ export class FluentButtonMaterial extends PushMaterial {
210
211
  }
211
212
  const defines = subMesh.materialDefines;
212
213
  const scene = this.getScene();
214
+ const blobTextureError = this._blobTexture.errorObject;
215
+ if (this._blobTexture.loadingError || blobTextureError) {
216
+ const textureErrorMessage = blobTextureError?.message || (blobTextureError?.exception instanceof Error ? blobTextureError.exception.message : undefined);
217
+ throw new Error(`FluentButtonMaterial "${this.name}" failed to load blob texture "${this._blobTextureUrl}"${textureErrorMessage ? `: ${textureErrorMessage}` : ""}. Check FluentButtonMaterial.BLOB_TEXTURE_URL and asset availability.`, { cause: blobTextureError?.exception });
218
+ }
213
219
  if (!this._blobTexture.isReady()) {
214
220
  return false;
215
221
  }
@@ -310,6 +316,7 @@ export class FluentButtonMaterial extends PushMaterial {
310
316
  samplers: samplers,
311
317
  defines: defines,
312
318
  maxSimultaneousLights: 4,
319
+ shaderLanguage: this._shaderLanguage,
313
320
  });
314
321
  subMesh.setEffect(scene.getEngine().createEffect(shaderName, {
315
322
  attributes: attribs,
@@ -321,6 +328,15 @@ export class FluentButtonMaterial extends PushMaterial {
321
328
  onCompiled: this.onCompiled,
322
329
  onError: this.onError,
323
330
  indexParameters: { maxSimultaneousLights: 4 },
331
+ shaderLanguage: this._shaderLanguage,
332
+ extraInitializationsAsync: this._shadersLoaded
333
+ ? undefined
334
+ : async () => {
335
+ if (this.shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
336
+ await Promise.all([import("./wgsl/fluentButton.vertex.js"), import("./wgsl/fluentButton.fragment.js")]);
337
+ }
338
+ this._shadersLoaded = true;
339
+ },
324
340
  }, engine), defines, this._materialContext);
325
341
  }
326
342
  if (!subMesh.effect || !subMesh.effect.isReady()) {
@@ -404,6 +420,10 @@ export class FluentButtonMaterial extends PushMaterial {
404
420
  getAnimatables() {
405
421
  return [];
406
422
  }
423
+ /**
424
+ * Disposes the material.
425
+ * @param forceDisposeEffect specifies if effects should be forcefully disposed
426
+ */
407
427
  dispose(forceDisposeEffect) {
408
428
  super.dispose(forceDisposeEffect);
409
429
  }
@@ -419,6 +439,13 @@ export class FluentButtonMaterial extends PushMaterial {
419
439
  return "FluentButtonMaterial";
420
440
  }
421
441
  // Statics
442
+ /**
443
+ * Creates a fluent button material from parsed material data.
444
+ * @param source defines the JSON representation of the material
445
+ * @param scene defines the hosting scene
446
+ * @param rootUrl defines the root URL to use to load textures and relative dependencies
447
+ * @returns a new fluent button material
448
+ */
422
449
  static Parse(source, scene, rootUrl) {
423
450
  return SerializationHelper.Parse(() => new FluentButtonMaterial(source.name, scene), source, scene, rootUrl);
424
451
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fluentButtonMaterial.js","sourceRoot":"","sources":["../../../../../../dev/gui/src/3D/materials/fluentButton/fluentButtonMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { serializeAsColor4, serializeAsVector3, serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type Matrix, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\nimport \"./shaders/fluentButton.fragment\";\r\nimport \"./shaders/fluentButton.vertex\";\r\nimport { HandleFallbacksForShadows, PrepareAttributesForInstances, PrepareDefinesForAttributes, PrepareUniformsAndSamplersList } from \"core/Materials/materialHelper.functions\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/** @internal */\r\nclass FluentButtonMaterialDefines extends MaterialDefines {\r\n public RELATIVE_WIDTH = true;\r\n public ENABLE_FADE = true;\r\n\r\n constructor() {\r\n super();\r\n this._needNormals = true;\r\n this._needUVs = true;\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * Class used to render square buttons with fluent design\r\n * @since 5.0.0\r\n */\r\nexport class FluentButtonMaterial extends PushMaterial {\r\n /**\r\n * URL pointing to the texture used to define the coloring for the fluent blob effect.\r\n */\r\n public static BLOB_TEXTURE_URL = \"https://assets.babylonjs.com/core/MRTK/mrtk-fluent-button-blob.png\";\r\n\r\n /**\r\n * Gets or sets the width of the glowing edge, relative to the scale of the button.\r\n * (Default is 4% of the height).\r\n */\r\n @serialize()\r\n public edgeWidth = 0.04;\r\n\r\n /**\r\n * Gets or sets the color of the glowing edge.\r\n */\r\n @serializeAsColor4()\r\n public edgeColor = new Color4(0.592157, 0.592157, 0.592157, 1.0);\r\n\r\n /**\r\n * Gets or sets the maximum intensity of the proximity light.\r\n */\r\n @serialize()\r\n public proximityMaxIntensity = 0.45;\r\n\r\n /**\r\n * Gets or sets the maximum distance for the proximity light (Default is 16mm).\r\n */\r\n @serialize()\r\n public proximityFarDistance = 0.16;\r\n\r\n /**\r\n * Gets or sets the radius of the proximity light when near to the surface.\r\n */\r\n @serialize()\r\n public proximityNearRadius = 1.5;\r\n\r\n /**\r\n * Gets or sets the anisotropy of the proximity light.\r\n */\r\n @serialize()\r\n public proximityAnisotropy = 1;\r\n\r\n /**\r\n * Gets or sets the amount of fuzzing in the selection focus.\r\n */\r\n @serialize()\r\n public selectionFuzz = 0.5;\r\n\r\n /**\r\n * Gets or sets an override value to display the button as selected.\r\n */\r\n @serialize()\r\n public selected = 0;\r\n\r\n /**\r\n * Gets or sets a value to manually fade the blob size.\r\n */\r\n @serialize()\r\n public selectionFade = 0;\r\n\r\n /**\r\n * Gets or sets a value to manually shrink the blob size as it fades (see selectionFade).\r\n */\r\n @serialize()\r\n public selectionFadeSize = 0.3;\r\n\r\n /**\r\n * Gets or sets the distance from the button the cursor should be for the button\r\n * to appear selected (Default is 8cm).\r\n */\r\n @serialize()\r\n public selectedDistance = 0.08;\r\n\r\n /**\r\n * Gets or sets the fall-off distance for the selection fade (Default is 8cm).\r\n */\r\n @serialize()\r\n public selectedFadeLength = 0.08;\r\n\r\n /**\r\n * Gets or sets the intensity of the luminous blob (Ranges 0-1, default is 0.5).\r\n */\r\n @serialize()\r\n public blobIntensity = 0.5;\r\n\r\n /**\r\n * The size of the blob when the pointer is at the blobFarDistance (Default is 5cm).\r\n */\r\n @serialize()\r\n public blobFarSize = 0.05;\r\n\r\n /**\r\n * The distance at which the pointer is considered near. See [left|right]BlobNearSize. (Default is 0cm).\r\n */\r\n @serialize()\r\n public blobNearDistance = 0;\r\n\r\n /**\r\n * The distance at which the pointer is considered far. See [left|right]BlobFarSize. (Default is 8cm).\r\n */\r\n @serialize()\r\n public blobFarDistance = 0.08;\r\n\r\n /**\r\n * The distance over which the blob intensity fades from full to none (Default is 8cm).\r\n */\r\n @serialize()\r\n public blobFadeLength = 0.08;\r\n\r\n /**\r\n * Gets or sets whether the blob corresponding to the left index finger is enabled.\r\n */\r\n @serialize()\r\n public leftBlobEnable = true;\r\n\r\n /**\r\n * Gets or sets the size of the left blob when the left pointer is considered near. See blobNearDistance. (Default is 2.5cm).\r\n */\r\n @serialize()\r\n public leftBlobNearSize = 0.025;\r\n\r\n /**\r\n * Gets or sets the progress of the pulse animation on the left blob (Ranges 0-1).\r\n */\r\n @serialize()\r\n public leftBlobPulse = 0;\r\n\r\n /**\r\n * Gets or sets the fade factor on the left blob.\r\n */\r\n @serialize()\r\n public leftBlobFade = 1;\r\n\r\n /**\r\n * Gets or sets the inner fade on the left blob;\r\n */\r\n @serialize()\r\n public leftBlobInnerFade = 0.01;\r\n\r\n /**\r\n * Gets or sets whether the blob corresponding to the right index finger is enabled.\r\n */\r\n @serialize()\r\n public rightBlobEnable = true;\r\n\r\n /**\r\n * Gets or sets the size of the right blob when the right pointer is considered near. See blobNearDistance. (Default is 2.5cm).\r\n */\r\n @serialize()\r\n public rightBlobNearSize = 0.025;\r\n\r\n /**\r\n * Gets or sets the progress of the pulse animation on the right blob (Ranges 0-1).\r\n */\r\n @serialize()\r\n public rightBlobPulse = 0;\r\n\r\n /**\r\n * Gets or sets the fade factor on the right blob.\r\n */\r\n @serialize()\r\n public rightBlobFade = 1;\r\n\r\n /**\r\n * Gets or sets the inner fade on the right blob;\r\n */\r\n @serialize()\r\n public rightBlobInnerFade = 0.01;\r\n\r\n /**\r\n * Gets or sets the direction of the active face before the world transform is applied.\r\n * This should almost always be set to -z.\r\n */\r\n @serializeAsVector3()\r\n public activeFaceDir = new Vector3(0, 0, -1);\r\n\r\n /**\r\n * Gets or sets the button's up direction before the world transform is applied.\r\n * This should almost always be set to +y.\r\n */\r\n @serializeAsVector3()\r\n public activeFaceUp = new Vector3(0, 1, 0);\r\n\r\n /**\r\n * Gets or sets whether the edge fade effect is enabled.\r\n */\r\n @serialize()\r\n public enableFade = true;\r\n\r\n /**\r\n * Gets or sets a value corresponding to the width of the edge fade effect (Default 1.5).\r\n */\r\n @serialize()\r\n public fadeWidth = 1.5;\r\n\r\n /**\r\n * Gets or sets whether the active face is smoothly interpolated.\r\n */\r\n @serialize()\r\n public smoothActiveFace = true;\r\n\r\n /**\r\n * Gets or sets whether the frame of the fluent button model is visible.\r\n * This is usually only enabled for debugging purposes.\r\n */\r\n @serialize()\r\n public showFrame = false;\r\n\r\n /**\r\n * Gets or sets whether the blob color texture is used for the proximity\r\n * light effect. This is usually only disabled for debugging purposes.\r\n */\r\n @serialize()\r\n public useBlobTexture = true;\r\n\r\n /**\r\n * Gets or sets the world-space position of the tip of the left index finger.\r\n */\r\n @serializeAsVector3()\r\n public globalLeftIndexTipPosition = Vector3.Zero();\r\n\r\n /**\r\n * Gets or sets the world-space position of the tip of the right index finger.\r\n */\r\n @serializeAsVector3()\r\n public globalRightIndexTipPosition = Vector3.Zero();\r\n\r\n private _blobTexture: Texture;\r\n\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n this.alphaMode = Constants.ALPHA_ADD;\r\n this.disableDepthWrite = true;\r\n this.backFaceCulling = false;\r\n const blobTextureUrl = Tools.GetAssetUrl(FluentButtonMaterial.BLOB_TEXTURE_URL);\r\n this._blobTexture = new Texture(blobTextureUrl, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n public override needAlphaTesting(): boolean {\r\n return true;\r\n }\r\n\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new FluentButtonMaterialDefines();\r\n }\r\n\r\n const defines = <FluentButtonMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (!this._blobTexture.isReady()) {\r\n return false;\r\n }\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, true, false);\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n\r\n scene.resetCachedMaterial();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n HandleFallbacksForShadows(defines, fallbacks);\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.NORMAL) {\r\n attribs.push(VertexBuffer.NormalKind);\r\n }\r\n\r\n if (defines.UV1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (defines.UV2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (defines.TANGENT) {\r\n attribs.push(VertexBuffer.TangentKind);\r\n }\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n // Legacy browser patch\r\n const shaderName = \"fluentButton\";\r\n const join = defines.toString();\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"viewProjection\",\r\n \"cameraPosition\",\r\n\r\n \"_Edge_Width_\",\r\n \"_Edge_Color_\",\r\n \"_Relative_Width_\",\r\n \"_Proximity_Max_Intensity_\",\r\n \"_Proximity_Far_Distance_\",\r\n \"_Proximity_Near_Radius_\",\r\n \"_Proximity_Anisotropy_\",\r\n \"_Selection_Fuzz_\",\r\n \"_Selected_\",\r\n \"_Selection_Fade_\",\r\n \"_Selection_Fade_Size_\",\r\n \"_Selected_Distance_\",\r\n \"_Selected_Fade_Length_\",\r\n \"_Blob_Enable_\",\r\n \"_Blob_Position_\",\r\n \"_Blob_Intensity_\",\r\n \"_Blob_Near_Size_\",\r\n \"_Blob_Far_Size_\",\r\n \"_Blob_Near_Distance_\",\r\n \"_Blob_Far_Distance_\",\r\n \"_Blob_Fade_Length_\",\r\n \"_Blob_Inner_Fade_\",\r\n \"_Blob_Pulse_\",\r\n \"_Blob_Fade_\",\r\n \"_Blob_Texture_\",\r\n \"_Blob_Enable_2_\",\r\n \"_Blob_Position_2_\",\r\n \"_Blob_Near_Size_2_\",\r\n \"_Blob_Inner_Fade_2_\",\r\n \"_Blob_Pulse_2_\",\r\n \"_Blob_Fade_2_\",\r\n \"_Active_Face_Dir_\",\r\n \"_Active_Face_Up_\",\r\n \"_Enable_Fade_\",\r\n \"_Fade_Width_\",\r\n \"_Smooth_Active_Face_\",\r\n \"_Show_Frame_\",\r\n \"_Use_Blob_Texture_\",\r\n\r\n \"Use_Global_Left_Index\",\r\n \"Use_Global_Right_Index\",\r\n \"Global_Left_Index_Tip_Position\",\r\n \"Global_Right_Index_Tip_Position\",\r\n \"Global_Left_Thumb_Tip_Position\",\r\n \"Global_Right_Thumb_Tip_Position\",\r\n \"Global_Left_Index_Tip_Proximity\",\r\n \"Global_Right_Index_Tip_Proximity\",\r\n ];\r\n const samplers: string[] = [\"_Blob_Texture_\"];\r\n const uniformBuffers: string[] = [];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: 4,\r\n });\r\n\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousLights: 4 },\r\n },\r\n engine\r\n ),\r\n defines,\r\n this._materialContext\r\n );\r\n }\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <FluentButtonMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n this._activeEffect.setVector3(\"cameraPosition\", scene.activeCamera!.position);\r\n\r\n // \"Blob Texture\"\r\n this._activeEffect.setTexture(\"_Blob_Texture_\", this._blobTexture);\r\n\r\n // \"Wireframe\"\r\n this._activeEffect.setFloat(\"_Edge_Width_\", this.edgeWidth);\r\n this._activeEffect.setColor4(\"_Edge_Color_\", new Color3(this.edgeColor.r, this.edgeColor.g, this.edgeColor.b), this.edgeColor.a);\r\n //define _Relative_Width_ true;\r\n\r\n // \"Proximity\"\r\n this._activeEffect.setFloat(\"_Proximity_Max_Intensity_\", this.proximityMaxIntensity);\r\n this._activeEffect.setFloat(\"_Proximity_Far_Distance_\", this.proximityFarDistance);\r\n this._activeEffect.setFloat(\"_Proximity_Near_Radius_\", this.proximityNearRadius);\r\n this._activeEffect.setFloat(\"_Proximity_Anisotropy_\", this.proximityAnisotropy);\r\n\r\n // \"Selection\"\r\n this._activeEffect.setFloat(\"_Selection_Fuzz_\", this.selectionFuzz);\r\n this._activeEffect.setFloat(\"_Selected_\", this.selected);\r\n this._activeEffect.setFloat(\"_Selection_Fade_\", this.selectionFade);\r\n this._activeEffect.setFloat(\"_Selection_Fade_Size_\", this.selectionFadeSize);\r\n this._activeEffect.setFloat(\"_Selected_Distance_\", this.selectedDistance);\r\n this._activeEffect.setFloat(\"_Selected_Fade_Length_\", this.selectedFadeLength);\r\n\r\n // \"Blob\"\r\n this._activeEffect.setFloat(\"_Blob_Enable_\", this.leftBlobEnable ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Blob_Intensity_\", this.blobIntensity);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_\", this.leftBlobNearSize);\r\n this._activeEffect.setFloat(\"_Blob_Far_Size_\", this.blobFarSize);\r\n this._activeEffect.setFloat(\"_Blob_Near_Distance_\", this.blobNearDistance);\r\n this._activeEffect.setFloat(\"_Blob_Far_Distance_\", this.blobFarDistance);\r\n this._activeEffect.setFloat(\"_Blob_Fade_Length_\", this.blobFadeLength);\r\n this._activeEffect.setFloat(\"_Blob_Inner_Fade_\", this.leftBlobInnerFade);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_\", this.leftBlobPulse);\r\n this._activeEffect.setFloat(\"_Blob_Fade_\", this.leftBlobFade);\r\n\r\n // \"Blob 2\"\r\n this._activeEffect.setFloat(\"_Blob_Enable_2_\", this.rightBlobEnable ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_2_\", this.rightBlobNearSize);\r\n this._activeEffect.setFloat(\"_Blob_Inner_Fade_2_\", this.rightBlobInnerFade);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_2_\", this.rightBlobPulse);\r\n this._activeEffect.setFloat(\"_Blob_Fade_2_\", this.rightBlobFade);\r\n\r\n // \"Active Face\"\r\n this._activeEffect.setVector3(\"_Active_Face_Dir_\", this.activeFaceDir);\r\n this._activeEffect.setVector3(\"_Active_Face_Up_\", this.activeFaceUp);\r\n\r\n // \"Hololens Edge Fade\"\r\n //define _Enable_Fade_ true;\r\n this._activeEffect.setFloat(\"_Fade_Width_\", this.fadeWidth);\r\n this._activeEffect.setFloat(\"_Smooth_Active_Face_\", this.smoothActiveFace ? 1.0 : 0.0);\r\n\r\n // \"Debug\"\r\n this._activeEffect.setFloat(\"_Show_Frame_\", this.showFrame ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Use_Blob_Texture_\", this.useBlobTexture ? 1.0 : 0.0);\r\n\r\n // Global inputs\r\n this._activeEffect.setFloat(\"Use_Global_Left_Index\", 1.0);\r\n this._activeEffect.setFloat(\"Use_Global_Right_Index\", 1.0);\r\n\r\n this._activeEffect.setVector4(\r\n \"Global_Left_Index_Tip_Position\",\r\n new Vector4(this.globalLeftIndexTipPosition.x, this.globalLeftIndexTipPosition.y, this.globalLeftIndexTipPosition.z, 1.0)\r\n );\r\n this._activeEffect.setVector4(\r\n \"Global_Right_Index_Tip_Position\",\r\n new Vector4(this.globalRightIndexTipPosition.x, this.globalRightIndexTipPosition.y, this.globalRightIndexTipPosition.z, 1.0)\r\n );\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public override getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public override clone(name: string): FluentButtonMaterial {\r\n return SerializationHelper.Clone(() => new FluentButtonMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.FluentButtonMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FluentButtonMaterial\";\r\n }\r\n\r\n // Statics\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): FluentButtonMaterial {\r\n return SerializationHelper.Parse(() => new FluentButtonMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.FluentButtonMaterial\", FluentButtonMaterial);\r\n"]}
1
+ {"version":3,"file":"fluentButtonMaterial.js","sourceRoot":"","sources":["../../../../../../dev/gui/src/3D/materials/fluentButton/fluentButtonMaterial.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAe,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,OAAO,iCAAiC,CAAC;AACzC,OAAO,+BAA+B,CAAC;AACvC,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAChL,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,gBAAgB;AAChB,MAAM,2BAA4B,SAAQ,eAAe;IAIrD;QACI,KAAK,EAAE,CAAC;QAJL,mBAAc,GAAG,IAAI,CAAC;QACtB,gBAAW,GAAG,IAAI,CAAC;QAItB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IAyOlD,YAAY,IAAY,EAAE,KAAa;QACnC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAzOf,mBAAc,GAAG,KAAK,CAAC;QAO/B;;;WAGG;QAEI,cAAS,GAAG,IAAI,CAAC;QAExB;;WAEG;QAEI,cAAS,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAEjE;;WAEG;QAEI,0BAAqB,GAAG,IAAI,CAAC;QAEpC;;WAEG;QAEI,yBAAoB,GAAG,IAAI,CAAC;QAEnC;;WAEG;QAEI,wBAAmB,GAAG,GAAG,CAAC;QAEjC;;WAEG;QAEI,wBAAmB,GAAG,CAAC,CAAC;QAE/B;;WAEG;QAEI,kBAAa,GAAG,GAAG,CAAC;QAE3B;;WAEG;QAEI,aAAQ,GAAG,CAAC,CAAC;QAEpB;;WAEG;QAEI,kBAAa,GAAG,CAAC,CAAC;QAEzB;;WAEG;QAEI,sBAAiB,GAAG,GAAG,CAAC;QAE/B;;;WAGG;QAEI,qBAAgB,GAAG,IAAI,CAAC;QAE/B;;WAEG;QAEI,uBAAkB,GAAG,IAAI,CAAC;QAEjC;;WAEG;QAEI,kBAAa,GAAG,GAAG,CAAC;QAE3B;;WAEG;QAEI,gBAAW,GAAG,IAAI,CAAC;QAE1B;;WAEG;QAEI,qBAAgB,GAAG,CAAC,CAAC;QAE5B;;WAEG;QAEI,oBAAe,GAAG,IAAI,CAAC;QAE9B;;WAEG;QAEI,mBAAc,GAAG,IAAI,CAAC;QAE7B;;WAEG;QAEI,mBAAc,GAAG,IAAI,CAAC;QAE7B;;WAEG;QAEI,qBAAgB,GAAG,KAAK,CAAC;QAEhC;;WAEG;QAEI,kBAAa,GAAG,CAAC,CAAC;QAEzB;;WAEG;QAEI,iBAAY,GAAG,CAAC,CAAC;QAExB;;WAEG;QAEI,sBAAiB,GAAG,IAAI,CAAC;QAEhC;;WAEG;QAEI,oBAAe,GAAG,IAAI,CAAC;QAE9B;;WAEG;QAEI,sBAAiB,GAAG,KAAK,CAAC;QAEjC;;WAEG;QAEI,mBAAc,GAAG,CAAC,CAAC;QAE1B;;WAEG;QAEI,kBAAa,GAAG,CAAC,CAAC;QAEzB;;WAEG;QAEI,uBAAkB,GAAG,IAAI,CAAC;QAEjC;;;WAGG;QAEI,kBAAa,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE7C;;;WAGG;QAEI,iBAAY,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE3C;;WAEG;QAEI,eAAU,GAAG,IAAI,CAAC;QAEzB;;WAEG;QAEI,cAAS,GAAG,GAAG,CAAC;QAEvB;;WAEG;QAEI,qBAAgB,GAAG,IAAI,CAAC;QAE/B;;;WAGG;QAEI,cAAS,GAAG,KAAK,CAAC;QAEzB;;;WAGG;QAEI,mBAAc,GAAG,IAAI,CAAC;QAE7B;;WAEG;QAEI,+BAA0B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAEnD;;WAEG;QAEI,gCAA2B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAOhD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;QACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QAChF,IAAI,CAAC,YAAY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACtH,CAAC;IAEe,iBAAiB;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAEe,gBAAgB;QAC5B,OAAO,IAAI,CAAC;IAChB,CAAC;IAEe,mBAAmB;QAC/B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,UAAU;IACM,iBAAiB,CAAC,IAAkB,EAAE,OAAgB;QAClE,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;QAEzC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,mBAAmB,EAAE,CAAC;gBACxD,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC3B,OAAO,CAAC,eAAe,GAAG,IAAI,2BAA2B,EAAE,CAAC;QAChE,CAAC;QAED,MAAM,OAAO,GAAgC,OAAO,CAAC,eAAe,CAAC;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE9B,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;QACvD,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,IAAI,gBAAgB,EAAE,CAAC;YACrD,MAAM,mBAAmB,GAAG,gBAAgB,EAAE,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACzJ,MAAM,IAAI,KAAK,CACX,yBAAyB,IAAI,CAAC,IAAI,kCAAkC,IAAI,CAAC,eAAe,IAAI,mBAAmB,CAAC,CAAC,CAAC,KAAK,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,uEAAuE,EACxN,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,CACzC,CAAC;QACN,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QAEjC,UAAU;QACV,2BAA2B,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAExD,qBAAqB;QACrB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,eAAe,EAAE,CAAC;YAE1B,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAE5B,YAAY;YACZ,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC;YAED,yBAAyB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAE9C,OAAO,CAAC,0BAA0B,GAAG,KAAK,CAAC,4BAA4B,CAAC,kBAAkB,CAAC;YAE3F,YAAY;YACZ,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAE5C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAC1C,CAAC;YAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC;YAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;YAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAC3C,CAAC;YAED,6BAA6B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEhD,uBAAuB;YACvB,MAAM,UAAU,GAAG,cAAc,CAAC;YAClC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YAEhC,MAAM,QAAQ,GAAG;gBACb,OAAO;gBACP,gBAAgB;gBAChB,gBAAgB;gBAEhB,cAAc;gBACd,cAAc;gBACd,kBAAkB;gBAClB,2BAA2B;gBAC3B,0BAA0B;gBAC1B,yBAAyB;gBACzB,wBAAwB;gBACxB,kBAAkB;gBAClB,YAAY;gBACZ,kBAAkB;gBAClB,uBAAuB;gBACvB,qBAAqB;gBACrB,wBAAwB;gBACxB,eAAe;gBACf,iBAAiB;gBACjB,kBAAkB;gBAClB,kBAAkB;gBAClB,iBAAiB;gBACjB,sBAAsB;gBACtB,qBAAqB;gBACrB,oBAAoB;gBACpB,mBAAmB;gBACnB,cAAc;gBACd,aAAa;gBACb,gBAAgB;gBAChB,iBAAiB;gBACjB,mBAAmB;gBACnB,oBAAoB;gBACpB,qBAAqB;gBACrB,gBAAgB;gBAChB,eAAe;gBACf,mBAAmB;gBACnB,kBAAkB;gBAClB,eAAe;gBACf,cAAc;gBACd,sBAAsB;gBACtB,cAAc;gBACd,oBAAoB;gBAEpB,uBAAuB;gBACvB,wBAAwB;gBACxB,gCAAgC;gBAChC,iCAAiC;gBACjC,gCAAgC;gBAChC,iCAAiC;gBACjC,iCAAiC;gBACjC,kCAAkC;aACrC,CAAC;YACF,MAAM,QAAQ,GAAa,CAAC,gBAAgB,CAAC,CAAC;YAC9C,MAAM,cAAc,GAAa,EAAE,CAAC;YAEpC,8BAA8B,CAAyB;gBACnD,aAAa,EAAE,QAAQ;gBACvB,mBAAmB,EAAE,cAAc;gBACnC,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,OAAO;gBAChB,qBAAqB,EAAE,CAAC;gBACxB,cAAc,EAAE,IAAI,CAAC,eAAe;aACvC,CAAC,CAAC;YAEH,OAAO,CAAC,SAAS,CACb,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,CAC1B,UAAU,EACc;gBACpB,UAAU,EAAE,OAAO;gBACnB,aAAa,EAAE,QAAQ;gBACvB,mBAAmB,EAAE,cAAc;gBACnC,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,SAAS;gBACpB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,eAAe,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE;gBAC7C,cAAc,EAAE,IAAI,CAAC,eAAe;gBACpC,yBAAyB,EAAE,IAAI,CAAC,cAAc;oBAC1C,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,KAAK,IAAI,EAAE;wBACP,IAAI,IAAI,CAAC,cAAc,gCAAwB,EAAE,CAAC;4BAC9C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,4BAA4B,CAAC,EAAE,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC;wBACtG,CAAC;wBAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC/B,CAAC;aACV,EACD,MAAM,CACT,EACD,OAAO,EACP,IAAI,CAAC,gBAAgB,CACxB,CAAC;QACN,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACxC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAEvC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEe,cAAc,CAAC,KAAa,EAAE,IAAU,EAAE,OAAgB;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE9B,MAAM,OAAO,GAAgC,OAAO,CAAC,eAAe,CAAC;QACrE,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO;QACX,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAE5B,WAAW;QACX,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,KAAK,CAAC,YAAa,CAAC,QAAQ,CAAC,CAAC;QAE9E,iBAAiB;QACjB,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAEnE,cAAc;QACd,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACjI,+BAA+B;QAE/B,cAAc;QACd,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,2BAA2B,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACrF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,0BAA0B,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACnF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,yBAAyB,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,wBAAwB,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAEhF,cAAc;QACd,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACpE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACpE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,qBAAqB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,wBAAwB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAE/E,SAAS;QACT,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACpE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACjE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,sBAAsB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,qBAAqB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACzE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACvE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAE9D,WAAW;QACX,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC1E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,qBAAqB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC5E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACnE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEjE,gBAAgB;QAChB,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,mBAAmB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACvE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAErE,uBAAuB;QACvB,4BAA4B;QAC5B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,sBAAsB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEvF,UAAU;QACV,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEnF,gBAAgB;QAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAE3D,IAAI,CAAC,aAAa,CAAC,UAAU,CACzB,gCAAgC,EAChC,IAAI,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC,EAAE,GAAG,CAAC,CAC5H,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,UAAU,CACzB,iCAAiC,EACjC,IAAI,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC,EAAE,GAAG,CAAC,CAC/H,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACa,cAAc;QAC1B,OAAO,EAAE,CAAC;IACd,CAAC;IAED;;;OAGG;IACa,OAAO,CAAC,kBAA4B;QAChD,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IAEe,KAAK,CAAC,IAAY;QAC9B,OAAO,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAClG,CAAC;IAEe,SAAS;QACrB,MAAM,mBAAmB,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QAC9C,mBAAmB,CAAC,UAAU,GAAG,8BAA8B,CAAC;QAChE,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAEe,YAAY;QACxB,OAAO,sBAAsB,CAAC;IAClC,CAAC;IAED,UAAU;IACV;;;;;;OAMG;IACI,MAAM,CAAU,KAAK,CAAC,MAAW,EAAE,KAAY,EAAE,OAAe;QACnE,OAAO,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACjH,CAAC;;AA1jBD;;GAEG;AACW,qCAAgB,GAAG,oEAAoE,AAAvE,CAAwE;AAO/F;IADN,SAAS,EAAE;uDACY;AAMjB;IADN,iBAAiB,EAAE;uDAC6C;AAM1D;IADN,SAAS,EAAE;mEACwB;AAM7B;IADN,SAAS,EAAE;kEACuB;AAM5B;IADN,SAAS,EAAE;iEACqB;AAM1B;IADN,SAAS,EAAE;iEACmB;AAMxB;IADN,SAAS,EAAE;2DACe;AAMpB;IADN,SAAS,EAAE;sDACQ;AAMb;IADN,SAAS,EAAE;2DACa;AAMlB;IADN,SAAS,EAAE;+DACmB;AAOxB;IADN,SAAS,EAAE;8DACmB;AAMxB;IADN,SAAS,EAAE;gEACqB;AAM1B;IADN,SAAS,EAAE;2DACe;AAMpB;IADN,SAAS,EAAE;yDACc;AAMnB;IADN,SAAS,EAAE;8DACgB;AAMrB;IADN,SAAS,EAAE;6DACkB;AAMvB;IADN,SAAS,EAAE;4DACiB;AAMtB;IADN,SAAS,EAAE;4DACiB;AAMtB;IADN,SAAS,EAAE;8DACoB;AAMzB;IADN,SAAS,EAAE;2DACa;AAMlB;IADN,SAAS,EAAE;0DACY;AAMjB;IADN,SAAS,EAAE;+DACoB;AAMzB;IADN,SAAS,EAAE;6DACkB;AAMvB;IADN,SAAS,EAAE;+DACqB;AAM1B;IADN,SAAS,EAAE;4DACc;AAMnB;IADN,SAAS,EAAE;2DACa;AAMlB;IADN,SAAS,EAAE;gEACqB;AAO1B;IADN,kBAAkB,EAAE;2DACwB;AAOtC;IADN,kBAAkB,EAAE;0DACsB;AAMpC;IADN,SAAS,EAAE;wDACa;AAMlB;IADN,SAAS,EAAE;uDACW;AAMhB;IADN,SAAS,EAAE;8DACmB;AAOxB;IADN,SAAS,EAAE;uDACa;AAOlB;IADN,SAAS,EAAE;4DACiB;AAMtB;IADN,kBAAkB,EAAE;wEAC8B;AAM5C;IADN,kBAAkB,EAAE;yEAC+B;AA4VxD,aAAa,CAAC,kCAAkC,EAAE,oBAAoB,CAAC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { serializeAsColor4, serializeAsVector3, serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type Matrix, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\nimport \"./shaders/fluentButton.fragment\";\r\nimport \"./shaders/fluentButton.vertex\";\r\nimport { HandleFallbacksForShadows, PrepareAttributesForInstances, PrepareDefinesForAttributes, PrepareUniformsAndSamplersList } from \"core/Materials/materialHelper.functions\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/** @internal */\r\nclass FluentButtonMaterialDefines extends MaterialDefines {\r\n public RELATIVE_WIDTH = true;\r\n public ENABLE_FADE = true;\r\n\r\n constructor() {\r\n super();\r\n this._needNormals = true;\r\n this._needUVs = true;\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * Class used to render square buttons with fluent design\r\n * @since 5.0.0\r\n */\r\nexport class FluentButtonMaterial extends PushMaterial {\r\n private _shadersLoaded = false;\r\n\r\n /**\r\n * URL pointing to the texture used to define the coloring for the fluent blob effect.\r\n */\r\n public static BLOB_TEXTURE_URL = \"https://assets.babylonjs.com/core/MRTK/mrtk-fluent-button-blob.png\";\r\n\r\n /**\r\n * Gets or sets the width of the glowing edge, relative to the scale of the button.\r\n * (Default is 4% of the height).\r\n */\r\n @serialize()\r\n public edgeWidth = 0.04;\r\n\r\n /**\r\n * Gets or sets the color of the glowing edge.\r\n */\r\n @serializeAsColor4()\r\n public edgeColor = new Color4(0.592157, 0.592157, 0.592157, 1.0);\r\n\r\n /**\r\n * Gets or sets the maximum intensity of the proximity light.\r\n */\r\n @serialize()\r\n public proximityMaxIntensity = 0.45;\r\n\r\n /**\r\n * Gets or sets the maximum distance for the proximity light (Default is 16mm).\r\n */\r\n @serialize()\r\n public proximityFarDistance = 0.16;\r\n\r\n /**\r\n * Gets or sets the radius of the proximity light when near to the surface.\r\n */\r\n @serialize()\r\n public proximityNearRadius = 1.5;\r\n\r\n /**\r\n * Gets or sets the anisotropy of the proximity light.\r\n */\r\n @serialize()\r\n public proximityAnisotropy = 1;\r\n\r\n /**\r\n * Gets or sets the amount of fuzzing in the selection focus.\r\n */\r\n @serialize()\r\n public selectionFuzz = 0.5;\r\n\r\n /**\r\n * Gets or sets an override value to display the button as selected.\r\n */\r\n @serialize()\r\n public selected = 0;\r\n\r\n /**\r\n * Gets or sets a value to manually fade the blob size.\r\n */\r\n @serialize()\r\n public selectionFade = 0;\r\n\r\n /**\r\n * Gets or sets a value to manually shrink the blob size as it fades (see selectionFade).\r\n */\r\n @serialize()\r\n public selectionFadeSize = 0.3;\r\n\r\n /**\r\n * Gets or sets the distance from the button the cursor should be for the button\r\n * to appear selected (Default is 8cm).\r\n */\r\n @serialize()\r\n public selectedDistance = 0.08;\r\n\r\n /**\r\n * Gets or sets the fall-off distance for the selection fade (Default is 8cm).\r\n */\r\n @serialize()\r\n public selectedFadeLength = 0.08;\r\n\r\n /**\r\n * Gets or sets the intensity of the luminous blob (Ranges 0-1, default is 0.5).\r\n */\r\n @serialize()\r\n public blobIntensity = 0.5;\r\n\r\n /**\r\n * The size of the blob when the pointer is at the blobFarDistance (Default is 5cm).\r\n */\r\n @serialize()\r\n public blobFarSize = 0.05;\r\n\r\n /**\r\n * The distance at which the pointer is considered near. See [left|right]BlobNearSize. (Default is 0cm).\r\n */\r\n @serialize()\r\n public blobNearDistance = 0;\r\n\r\n /**\r\n * The distance at which the pointer is considered far. See [left|right]BlobFarSize. (Default is 8cm).\r\n */\r\n @serialize()\r\n public blobFarDistance = 0.08;\r\n\r\n /**\r\n * The distance over which the blob intensity fades from full to none (Default is 8cm).\r\n */\r\n @serialize()\r\n public blobFadeLength = 0.08;\r\n\r\n /**\r\n * Gets or sets whether the blob corresponding to the left index finger is enabled.\r\n */\r\n @serialize()\r\n public leftBlobEnable = true;\r\n\r\n /**\r\n * Gets or sets the size of the left blob when the left pointer is considered near. See blobNearDistance. (Default is 2.5cm).\r\n */\r\n @serialize()\r\n public leftBlobNearSize = 0.025;\r\n\r\n /**\r\n * Gets or sets the progress of the pulse animation on the left blob (Ranges 0-1).\r\n */\r\n @serialize()\r\n public leftBlobPulse = 0;\r\n\r\n /**\r\n * Gets or sets the fade factor on the left blob.\r\n */\r\n @serialize()\r\n public leftBlobFade = 1;\r\n\r\n /**\r\n * Gets or sets the inner fade on the left blob;\r\n */\r\n @serialize()\r\n public leftBlobInnerFade = 0.01;\r\n\r\n /**\r\n * Gets or sets whether the blob corresponding to the right index finger is enabled.\r\n */\r\n @serialize()\r\n public rightBlobEnable = true;\r\n\r\n /**\r\n * Gets or sets the size of the right blob when the right pointer is considered near. See blobNearDistance. (Default is 2.5cm).\r\n */\r\n @serialize()\r\n public rightBlobNearSize = 0.025;\r\n\r\n /**\r\n * Gets or sets the progress of the pulse animation on the right blob (Ranges 0-1).\r\n */\r\n @serialize()\r\n public rightBlobPulse = 0;\r\n\r\n /**\r\n * Gets or sets the fade factor on the right blob.\r\n */\r\n @serialize()\r\n public rightBlobFade = 1;\r\n\r\n /**\r\n * Gets or sets the inner fade on the right blob;\r\n */\r\n @serialize()\r\n public rightBlobInnerFade = 0.01;\r\n\r\n /**\r\n * Gets or sets the direction of the active face before the world transform is applied.\r\n * This should almost always be set to -z.\r\n */\r\n @serializeAsVector3()\r\n public activeFaceDir = new Vector3(0, 0, -1);\r\n\r\n /**\r\n * Gets or sets the button's up direction before the world transform is applied.\r\n * This should almost always be set to +y.\r\n */\r\n @serializeAsVector3()\r\n public activeFaceUp = new Vector3(0, 1, 0);\r\n\r\n /**\r\n * Gets or sets whether the edge fade effect is enabled.\r\n */\r\n @serialize()\r\n public enableFade = true;\r\n\r\n /**\r\n * Gets or sets a value corresponding to the width of the edge fade effect (Default 1.5).\r\n */\r\n @serialize()\r\n public fadeWidth = 1.5;\r\n\r\n /**\r\n * Gets or sets whether the active face is smoothly interpolated.\r\n */\r\n @serialize()\r\n public smoothActiveFace = true;\r\n\r\n /**\r\n * Gets or sets whether the frame of the fluent button model is visible.\r\n * This is usually only enabled for debugging purposes.\r\n */\r\n @serialize()\r\n public showFrame = false;\r\n\r\n /**\r\n * Gets or sets whether the blob color texture is used for the proximity\r\n * light effect. This is usually only disabled for debugging purposes.\r\n */\r\n @serialize()\r\n public useBlobTexture = true;\r\n\r\n /**\r\n * Gets or sets the world-space position of the tip of the left index finger.\r\n */\r\n @serializeAsVector3()\r\n public globalLeftIndexTipPosition = Vector3.Zero();\r\n\r\n /**\r\n * Gets or sets the world-space position of the tip of the right index finger.\r\n */\r\n @serializeAsVector3()\r\n public globalRightIndexTipPosition = Vector3.Zero();\r\n\r\n private _blobTexture: Texture;\r\n private _blobTextureUrl: string;\r\n\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n this.alphaMode = Constants.ALPHA_ADD;\r\n this.disableDepthWrite = true;\r\n this.backFaceCulling = false;\r\n this._blobTextureUrl = Tools.GetAssetUrl(FluentButtonMaterial.BLOB_TEXTURE_URL);\r\n this._blobTexture = new Texture(this._blobTextureUrl, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n public override needAlphaTesting(): boolean {\r\n return true;\r\n }\r\n\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new FluentButtonMaterialDefines();\r\n }\r\n\r\n const defines = <FluentButtonMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n const blobTextureError = this._blobTexture.errorObject;\r\n if (this._blobTexture.loadingError || blobTextureError) {\r\n const textureErrorMessage = blobTextureError?.message || (blobTextureError?.exception instanceof Error ? blobTextureError.exception.message : undefined);\r\n throw new Error(\r\n `FluentButtonMaterial \"${this.name}\" failed to load blob texture \"${this._blobTextureUrl}\"${textureErrorMessage ? `: ${textureErrorMessage}` : \"\"}. Check FluentButtonMaterial.BLOB_TEXTURE_URL and asset availability.`,\r\n { cause: blobTextureError?.exception }\r\n );\r\n }\r\n\r\n if (!this._blobTexture.isReady()) {\r\n return false;\r\n }\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, true, false);\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n\r\n scene.resetCachedMaterial();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n HandleFallbacksForShadows(defines, fallbacks);\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.NORMAL) {\r\n attribs.push(VertexBuffer.NormalKind);\r\n }\r\n\r\n if (defines.UV1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (defines.UV2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (defines.TANGENT) {\r\n attribs.push(VertexBuffer.TangentKind);\r\n }\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n // Legacy browser patch\r\n const shaderName = \"fluentButton\";\r\n const join = defines.toString();\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"viewProjection\",\r\n \"cameraPosition\",\r\n\r\n \"_Edge_Width_\",\r\n \"_Edge_Color_\",\r\n \"_Relative_Width_\",\r\n \"_Proximity_Max_Intensity_\",\r\n \"_Proximity_Far_Distance_\",\r\n \"_Proximity_Near_Radius_\",\r\n \"_Proximity_Anisotropy_\",\r\n \"_Selection_Fuzz_\",\r\n \"_Selected_\",\r\n \"_Selection_Fade_\",\r\n \"_Selection_Fade_Size_\",\r\n \"_Selected_Distance_\",\r\n \"_Selected_Fade_Length_\",\r\n \"_Blob_Enable_\",\r\n \"_Blob_Position_\",\r\n \"_Blob_Intensity_\",\r\n \"_Blob_Near_Size_\",\r\n \"_Blob_Far_Size_\",\r\n \"_Blob_Near_Distance_\",\r\n \"_Blob_Far_Distance_\",\r\n \"_Blob_Fade_Length_\",\r\n \"_Blob_Inner_Fade_\",\r\n \"_Blob_Pulse_\",\r\n \"_Blob_Fade_\",\r\n \"_Blob_Texture_\",\r\n \"_Blob_Enable_2_\",\r\n \"_Blob_Position_2_\",\r\n \"_Blob_Near_Size_2_\",\r\n \"_Blob_Inner_Fade_2_\",\r\n \"_Blob_Pulse_2_\",\r\n \"_Blob_Fade_2_\",\r\n \"_Active_Face_Dir_\",\r\n \"_Active_Face_Up_\",\r\n \"_Enable_Fade_\",\r\n \"_Fade_Width_\",\r\n \"_Smooth_Active_Face_\",\r\n \"_Show_Frame_\",\r\n \"_Use_Blob_Texture_\",\r\n\r\n \"Use_Global_Left_Index\",\r\n \"Use_Global_Right_Index\",\r\n \"Global_Left_Index_Tip_Position\",\r\n \"Global_Right_Index_Tip_Position\",\r\n \"Global_Left_Thumb_Tip_Position\",\r\n \"Global_Right_Thumb_Tip_Position\",\r\n \"Global_Left_Index_Tip_Proximity\",\r\n \"Global_Right_Index_Tip_Proximity\",\r\n ];\r\n const samplers: string[] = [\"_Blob_Texture_\"];\r\n const uniformBuffers: string[] = [];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: 4,\r\n shaderLanguage: this._shaderLanguage,\r\n });\r\n\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousLights: 4 },\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: this._shadersLoaded\r\n ? undefined\r\n : async () => {\r\n if (this.shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"./wgsl/fluentButton.vertex\"), import(\"./wgsl/fluentButton.fragment\")]);\r\n }\r\n\r\n this._shadersLoaded = true;\r\n },\r\n },\r\n engine\r\n ),\r\n defines,\r\n this._materialContext\r\n );\r\n }\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <FluentButtonMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n this._activeEffect.setVector3(\"cameraPosition\", scene.activeCamera!.position);\r\n\r\n // \"Blob Texture\"\r\n this._activeEffect.setTexture(\"_Blob_Texture_\", this._blobTexture);\r\n\r\n // \"Wireframe\"\r\n this._activeEffect.setFloat(\"_Edge_Width_\", this.edgeWidth);\r\n this._activeEffect.setColor4(\"_Edge_Color_\", new Color3(this.edgeColor.r, this.edgeColor.g, this.edgeColor.b), this.edgeColor.a);\r\n //define _Relative_Width_ true;\r\n\r\n // \"Proximity\"\r\n this._activeEffect.setFloat(\"_Proximity_Max_Intensity_\", this.proximityMaxIntensity);\r\n this._activeEffect.setFloat(\"_Proximity_Far_Distance_\", this.proximityFarDistance);\r\n this._activeEffect.setFloat(\"_Proximity_Near_Radius_\", this.proximityNearRadius);\r\n this._activeEffect.setFloat(\"_Proximity_Anisotropy_\", this.proximityAnisotropy);\r\n\r\n // \"Selection\"\r\n this._activeEffect.setFloat(\"_Selection_Fuzz_\", this.selectionFuzz);\r\n this._activeEffect.setFloat(\"_Selected_\", this.selected);\r\n this._activeEffect.setFloat(\"_Selection_Fade_\", this.selectionFade);\r\n this._activeEffect.setFloat(\"_Selection_Fade_Size_\", this.selectionFadeSize);\r\n this._activeEffect.setFloat(\"_Selected_Distance_\", this.selectedDistance);\r\n this._activeEffect.setFloat(\"_Selected_Fade_Length_\", this.selectedFadeLength);\r\n\r\n // \"Blob\"\r\n this._activeEffect.setFloat(\"_Blob_Enable_\", this.leftBlobEnable ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Blob_Intensity_\", this.blobIntensity);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_\", this.leftBlobNearSize);\r\n this._activeEffect.setFloat(\"_Blob_Far_Size_\", this.blobFarSize);\r\n this._activeEffect.setFloat(\"_Blob_Near_Distance_\", this.blobNearDistance);\r\n this._activeEffect.setFloat(\"_Blob_Far_Distance_\", this.blobFarDistance);\r\n this._activeEffect.setFloat(\"_Blob_Fade_Length_\", this.blobFadeLength);\r\n this._activeEffect.setFloat(\"_Blob_Inner_Fade_\", this.leftBlobInnerFade);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_\", this.leftBlobPulse);\r\n this._activeEffect.setFloat(\"_Blob_Fade_\", this.leftBlobFade);\r\n\r\n // \"Blob 2\"\r\n this._activeEffect.setFloat(\"_Blob_Enable_2_\", this.rightBlobEnable ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_2_\", this.rightBlobNearSize);\r\n this._activeEffect.setFloat(\"_Blob_Inner_Fade_2_\", this.rightBlobInnerFade);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_2_\", this.rightBlobPulse);\r\n this._activeEffect.setFloat(\"_Blob_Fade_2_\", this.rightBlobFade);\r\n\r\n // \"Active Face\"\r\n this._activeEffect.setVector3(\"_Active_Face_Dir_\", this.activeFaceDir);\r\n this._activeEffect.setVector3(\"_Active_Face_Up_\", this.activeFaceUp);\r\n\r\n // \"Hololens Edge Fade\"\r\n //define _Enable_Fade_ true;\r\n this._activeEffect.setFloat(\"_Fade_Width_\", this.fadeWidth);\r\n this._activeEffect.setFloat(\"_Smooth_Active_Face_\", this.smoothActiveFace ? 1.0 : 0.0);\r\n\r\n // \"Debug\"\r\n this._activeEffect.setFloat(\"_Show_Frame_\", this.showFrame ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Use_Blob_Texture_\", this.useBlobTexture ? 1.0 : 0.0);\r\n\r\n // Global inputs\r\n this._activeEffect.setFloat(\"Use_Global_Left_Index\", 1.0);\r\n this._activeEffect.setFloat(\"Use_Global_Right_Index\", 1.0);\r\n\r\n this._activeEffect.setVector4(\r\n \"Global_Left_Index_Tip_Position\",\r\n new Vector4(this.globalLeftIndexTipPosition.x, this.globalLeftIndexTipPosition.y, this.globalLeftIndexTipPosition.z, 1.0)\r\n );\r\n this._activeEffect.setVector4(\r\n \"Global_Right_Index_Tip_Position\",\r\n new Vector4(this.globalRightIndexTipPosition.x, this.globalRightIndexTipPosition.y, this.globalRightIndexTipPosition.z, 1.0)\r\n );\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public override getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n /**\r\n * Disposes the material.\r\n * @param forceDisposeEffect specifies if effects should be forcefully disposed\r\n */\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public override clone(name: string): FluentButtonMaterial {\r\n return SerializationHelper.Clone(() => new FluentButtonMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.FluentButtonMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FluentButtonMaterial\";\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a fluent button material from parsed material data.\r\n * @param source defines the JSON representation of the material\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a new fluent button material\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): FluentButtonMaterial {\r\n return SerializationHelper.Parse(() => new FluentButtonMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.FluentButtonMaterial\", FluentButtonMaterial);\r\n"]}
@@ -0,0 +1,5 @@
1
+ /** @internal */
2
+ export declare const fluentButtonPixelShaderWGSL: {
3
+ name: string;
4
+ shader: string;
5
+ };
@@ -0,0 +1,20 @@
1
+ // Do not edit.
2
+ import { ShaderStore } from "@babylonjs/core/Engines/shaderStore.js";
3
+ const name = "fluentButtonPixelShader";
4
+ const shader = `varying vPosition: vec3f;varying vNormal: vec3f;varying vUV: vec2f;varying vTangent: vec3f;varying vBinormal: vec3f;varying vColor: vec4f;varying vExtra1: vec4f;uniform _Edge_Color_: vec4f;uniform _Proximity_Max_Intensity_: f32;uniform _Proximity_Near_Radius_: f32;uniform _Fade_Width_: f32;uniform _Blob_Position_: vec3f;uniform _Blob_Position_2_: vec3f;uniform _Use_Blob_Texture_: f32;uniform _Show_Frame_: f32;uniform Use_Global_Left_Index: f32;uniform Use_Global_Right_Index: f32;uniform Global_Left_Index_Tip_Position: vec4f;uniform Global_Right_Index_Tip_Position: vec4f;var _Blob_Texture_Sampler: sampler;var _Blob_Texture_: texture_2d<f32>;fn filterStep(edge: vec2f,x: vec2f)->vec2f {let dX: vec2f=max(fwidth(x),vec2f(0.00001));return clamp((x+dX-max(edge,x-dX))/(dX*2.0),vec2f(0.0),vec2f(1.0));}
5
+ @fragment
6
+ fn main(input: FragmentInputs)->FragmentOutputs {
7
+ #ifdef ENABLE_FADE
8
+ let edgeC: vec2f=vec2f(min(input.vColor.r,input.vColor.g),min(input.vColor.b,input.vColor.a));let edgeDf: vec2f=fwidth(edgeC)*uniforms._Fade_Width_;let edgeG: vec2f=clamp(edgeC/edgeDf,vec2f(0.0),vec2f(1.0));let notEdge: f32=edgeG.x*edgeG.y;
9
+ #else
10
+ let notEdge: f32=1.0;
11
+ #endif
12
+ let k: f32=dot(input.vUV,input.vUV);let blobTextureCoord: vec2f=vec2f(sqrt(k),1.0-input.vTangent.x);let proceduralBlob: vec4f=vec4f(1.0)*step(1.0-input.vTangent.x,clamp(sqrt(k)+0.1,0.0,1.0));let sampledBlob: vec4f=textureSample(_Blob_Texture_,_Blob_Texture_Sampler,blobTextureCoord);let blobColor: vec4f=mix(proceduralBlob,sampledBlob,step(0.5,uniforms._Use_Blob_Texture_));let blob: vec4f=input.vTangent.y*blobColor*(1.0-clamp(k,0.0,1.0));let blobPositionLeft: vec3f=mix(uniforms._Blob_Position_,uniforms.Global_Left_Index_Tip_Position.xyz,step(0.5,uniforms.Use_Global_Left_Index));let blobPositionRight: vec3f=mix(uniforms._Blob_Position_2_,uniforms.Global_Right_Index_Tip_Position.xyz,step(0.5,uniforms.Use_Global_Right_Index));let distanceXY: f32=sqrt(min(dot(input.vExtra1.xy,input.vExtra1.xy),dot(input.vExtra1.zw,input.vExtra1.zw))+input.vBinormal.y*input.vBinormal.y);let proximity: f32=input.vBinormal.z*uniforms._Proximity_Max_Intensity_*(1.0-clamp(distanceXY/uniforms._Proximity_Near_Radius_,0.0,1.0))*(1.0-input.vBinormal.x)+input.vBinormal.x;let edgeUV: vec2f=min(input.vUV,vec2f(1.0)-input.vUV);let wireFilter: vec2f=filterStep(input.vNormal.xy*0.5,edgeUV);let wireframe: vec4f=(1.0-min(wireFilter.x,wireFilter.y))*proximity*uniforms._Edge_Color_;let wireOrBlob: vec4f=mix(wireframe,blob,input.vNormal.z);let color: vec4f=mix(wireOrBlob,vec4f(0.3,0.3,0.3,0.3),step(0.5,uniforms._Show_Frame_));fragmentOutputs.color=notEdge*color;}
13
+ `;
14
+ // Sideeffect
15
+ if (!ShaderStore.ShadersStoreWGSL[name]) {
16
+ ShaderStore.ShadersStoreWGSL[name] = shader;
17
+ }
18
+ /** @internal */
19
+ export const fluentButtonPixelShaderWGSL = { name, shader };
20
+ //# sourceMappingURL=fluentButton.fragment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluentButton.fragment.js","sourceRoot":"","sources":["../../../../../../../dev/gui/src/3D/materials/fluentButton/wgsl/fluentButton.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,IAAI,GAAG,yBAAyB,CAAC;AACvC,MAAM,MAAM,GAAG;;;;;;;;;CASd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentButtonPixelShader\";\nconst shader = `varying vPosition: vec3f;varying vNormal: vec3f;varying vUV: vec2f;varying vTangent: vec3f;varying vBinormal: vec3f;varying vColor: vec4f;varying vExtra1: vec4f;uniform _Edge_Color_: vec4f;uniform _Proximity_Max_Intensity_: f32;uniform _Proximity_Near_Radius_: f32;uniform _Fade_Width_: f32;uniform _Blob_Position_: vec3f;uniform _Blob_Position_2_: vec3f;uniform _Use_Blob_Texture_: f32;uniform _Show_Frame_: f32;uniform Use_Global_Left_Index: f32;uniform Use_Global_Right_Index: f32;uniform Global_Left_Index_Tip_Position: vec4f;uniform Global_Right_Index_Tip_Position: vec4f;var _Blob_Texture_Sampler: sampler;var _Blob_Texture_: texture_2d<f32>;fn filterStep(edge: vec2f,x: vec2f)->vec2f {let dX: vec2f=max(fwidth(x),vec2f(0.00001));return clamp((x+dX-max(edge,x-dX))/(dX*2.0),vec2f(0.0),vec2f(1.0));}\n@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {\n#ifdef ENABLE_FADE\nlet edgeC: vec2f=vec2f(min(input.vColor.r,input.vColor.g),min(input.vColor.b,input.vColor.a));let edgeDf: vec2f=fwidth(edgeC)*uniforms._Fade_Width_;let edgeG: vec2f=clamp(edgeC/edgeDf,vec2f(0.0),vec2f(1.0));let notEdge: f32=edgeG.x*edgeG.y;\n#else\nlet notEdge: f32=1.0;\n#endif\nlet k: f32=dot(input.vUV,input.vUV);let blobTextureCoord: vec2f=vec2f(sqrt(k),1.0-input.vTangent.x);let proceduralBlob: vec4f=vec4f(1.0)*step(1.0-input.vTangent.x,clamp(sqrt(k)+0.1,0.0,1.0));let sampledBlob: vec4f=textureSample(_Blob_Texture_,_Blob_Texture_Sampler,blobTextureCoord);let blobColor: vec4f=mix(proceduralBlob,sampledBlob,step(0.5,uniforms._Use_Blob_Texture_));let blob: vec4f=input.vTangent.y*blobColor*(1.0-clamp(k,0.0,1.0));let blobPositionLeft: vec3f=mix(uniforms._Blob_Position_,uniforms.Global_Left_Index_Tip_Position.xyz,step(0.5,uniforms.Use_Global_Left_Index));let blobPositionRight: vec3f=mix(uniforms._Blob_Position_2_,uniforms.Global_Right_Index_Tip_Position.xyz,step(0.5,uniforms.Use_Global_Right_Index));let distanceXY: f32=sqrt(min(dot(input.vExtra1.xy,input.vExtra1.xy),dot(input.vExtra1.zw,input.vExtra1.zw))+input.vBinormal.y*input.vBinormal.y);let proximity: f32=input.vBinormal.z*uniforms._Proximity_Max_Intensity_*(1.0-clamp(distanceXY/uniforms._Proximity_Near_Radius_,0.0,1.0))*(1.0-input.vBinormal.x)+input.vBinormal.x;let edgeUV: vec2f=min(input.vUV,vec2f(1.0)-input.vUV);let wireFilter: vec2f=filterStep(input.vNormal.xy*0.5,edgeUV);let wireframe: vec4f=(1.0-min(wireFilter.x,wireFilter.y))*proximity*uniforms._Edge_Color_;let wireOrBlob: vec4f=mix(wireframe,blob,input.vNormal.z);let color: vec4f=mix(wireOrBlob,vec4f(0.3,0.3,0.3,0.3),step(0.5,uniforms._Show_Frame_));fragmentOutputs.color=notEdge*color;}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n\n/** @internal */\nexport const fluentButtonPixelShaderWGSL = { name, shader };\n"]}
@@ -0,0 +1,5 @@
1
+ /** @internal */
2
+ export declare const fluentButtonVertexShaderWGSL: {
3
+ name: string;
4
+ shader: string;
5
+ };
@@ -0,0 +1,31 @@
1
+ // Do not edit.
2
+ import { ShaderStore } from "@babylonjs/core/Engines/shaderStore.js";
3
+ const name = "fluentButtonVertexShader";
4
+ const shader = `uniform world: mat4x4f;uniform viewProjection: mat4x4f;uniform cameraPosition: vec3f;attribute position: vec3f;attribute normal: vec3f;attribute uv: vec2f;attribute tangent: vec3f;attribute color: vec4f;uniform _Edge_Width_: f32;uniform _Proximity_Far_Distance_: f32;uniform _Proximity_Near_Radius_: f32;uniform _Proximity_Anisotropy_: f32;uniform _Selection_Fuzz_: f32;uniform _Selected_: f32;uniform _Selection_Fade_: f32;uniform _Selection_Fade_Size_: f32;uniform _Selected_Distance_: f32;uniform _Selected_Fade_Length_: f32;uniform _Blob_Enable_: f32;uniform _Blob_Position_: vec3f;uniform _Blob_Intensity_: f32;uniform _Blob_Near_Size_: f32;uniform _Blob_Far_Size_: f32;uniform _Blob_Near_Distance_: f32;uniform _Blob_Far_Distance_: f32;uniform _Blob_Fade_Length_: f32;uniform _Blob_Inner_Fade_: f32;uniform _Blob_Pulse_: f32;uniform _Blob_Fade_: f32;uniform _Blob_Enable_2_: f32;uniform _Blob_Position_2_: vec3f;uniform _Blob_Near_Size_2_: f32;uniform _Blob_Inner_Fade_2_: f32;uniform _Blob_Pulse_2_: f32;uniform _Blob_Fade_2_: f32;uniform _Active_Face_Dir_: vec3f;uniform _Active_Face_Up_: vec3f;uniform _Smooth_Active_Face_: f32;uniform Use_Global_Left_Index: f32;uniform Use_Global_Right_Index: f32;uniform Global_Left_Index_Tip_Position: vec4f;uniform Global_Right_Index_Tip_Position: vec4f;varying vPosition: vec3f;varying vNormal: vec3f;varying vUV: vec2f;varying vTangent: vec3f;varying vBinormal: vec3f;varying vColor: vec4f;varying vExtra1: vec4f;fn ramp2(start: vec2f,end: vec2f,x: vec2f)->vec2f {return clamp((x-start)/(end-start),vec2f(0.0),vec2f(1.0));}
5
+ fn computeSelection(
6
+ blobPosition: vec3f,
7
+ normal: vec3f,
8
+ tangentDir: vec3f,
9
+ bitangent: vec3f,
10
+ faceCenter: vec3f,
11
+ faceSize: vec2f,
12
+ selectionFuzz: f32,
13
+ farDistance: f32,
14
+ fadeLength: f32
15
+ )->f32 {let delta: vec3f=blobPosition-faceCenter;let absD: f32=abs(dot(delta,normal));let fadeIn: f32=1.0-clamp((absD-farDistance)/fadeLength,0.0,1.0);let blobCenterXY: vec2f=vec2f(dot(delta,tangentDir),dot(delta,bitangent));let innerFace: vec2f=faceSize*(1.0-selectionFuzz)*0.5;let selectPulse: vec2f=ramp2(-faceSize*0.5,-innerFace,blobCenterXY)-ramp2(innerFace,faceSize*0.5,blobCenterXY);return selectPulse.x*selectPulse.y*fadeIn;}
16
+ @vertex
17
+ fn main(input: VertexInputs)->FragmentInputs {let blobPositionLeft: vec3f=mix(uniforms._Blob_Position_,uniforms.Global_Left_Index_Tip_Position.xyz,step(0.5,uniforms.Use_Global_Left_Index));let blobPositionRight: vec3f=mix(uniforms._Blob_Position_2_,uniforms.Global_Right_Index_Tip_Position.xyz,step(0.5,uniforms.Use_Global_Right_Index));let activeFaceCenter: vec3f=(uniforms.world*vec4f(uniforms._Active_Face_Dir_*0.5,1.0)).xyz;let activeFaceDir: vec3f=normalize((uniforms.world*vec4f(uniforms._Active_Face_Dir_,0.0)).xyz);
18
+ #ifdef RELATIVE_WIDTH
19
+ let relativeScale: f32=length((uniforms.world*vec4f(vec3f(0.0,1.0,0.0),0.0)).xyz);
20
+ #else
21
+ let relativeScale: f32=1.0;
22
+ #endif
23
+ let tangentWorld: vec3f=(uniforms.world*vec4f(vertexInputs.tangent,0.0)).xyz;let binormalObject: vec3f=cross(vertexInputs.normal,vertexInputs.tangent);let binormalWorld: vec3f=(uniforms.world*vec4f(binormalObject,0.0)).xyz;let normalWorld: vec3f=(uniforms.world*vec4f(vertexInputs.normal,0.0)).xyz;let normalWorldN: vec3f=normalize(normalWorld);let tangentWorldN: vec3f=normalize(tangentWorld);let binormalWorldN: vec3f=normalize(binormalWorld);let faceCenter: vec3f=(uniforms.world*vec4f(0.5*vertexInputs.normal,1.0)).xyz;let faceSize: vec2f=vec2f(length(tangentWorld),length(binormalWorld));let chosenBlobPosition: vec3f=mix(blobPositionLeft,blobPositionRight,vertexInputs.color.g);let chosenBlobEnable: f32=mix(uniforms._Blob_Enable_,uniforms._Blob_Enable_2_,vertexInputs.color.g);let chosenBlobPulse: f32=mix(uniforms._Blob_Pulse_,uniforms._Blob_Pulse_2_,vertexInputs.color.g);let chosenBlobFade: f32=mix(uniforms._Blob_Fade_,uniforms._Blob_Fade_2_,vertexInputs.color.g);let chosenBlobNearSize: f32=mix(uniforms._Blob_Near_Size_,uniforms._Blob_Near_Size_2_,vertexInputs.color.g);let chosenBlobInnerFade: f32=mix(uniforms._Blob_Inner_Fade_,uniforms._Blob_Inner_Fade_2_,vertexInputs.color.g);let selectLeft: f32=computeSelection(blobPositionLeft,normalWorldN,tangentWorldN,binormalWorldN,faceCenter,faceSize,uniforms._Selection_Fuzz_,uniforms._Selected_Distance_,uniforms._Selected_Fade_Length_);let selectRight: f32=computeSelection(blobPositionRight,normalWorldN,tangentWorldN,binormalWorldN,faceCenter,faceSize,uniforms._Selection_Fuzz_,uniforms._Selected_Distance_,uniforms._Selected_Fade_Length_);let activeFaceAmount: f32=max(0.0,dot(activeFaceDir,normalWorldN));let showSelection: f32=mix(max(selectLeft,selectRight),1.0,uniforms._Selected_)*activeFaceAmount;let upWorld: vec3f=normalize((uniforms.world*vec4f(uniforms._Active_Face_Up_,0.0)).xyz);let edgeWidth: f32=uniforms._Edge_Width_*relativeScale;let boxEdges: vec3f=(uniforms.world*vec4f(vec3f(0.5),0.0)).xyz;let boxMaxSize: f32=length(boxEdges);let d1: f32=dot(blobPositionLeft-activeFaceCenter,activeFaceDir);let d2: f32=dot(blobPositionRight-activeFaceCenter,activeFaceDir);let projectedBlobLeft: vec3f=blobPositionLeft-d1*activeFaceDir;let projectedBlobRight: vec3f=blobPositionRight-d2*activeFaceDir;let nearestProxDist: f32=sqrt(min(dot(projectedBlobLeft-activeFaceCenter,projectedBlobLeft-activeFaceCenter),dot(projectedBlobRight-activeFaceCenter,projectedBlobRight-activeFaceCenter)));let visibleWidth: f32=edgeWidth*(1.0-step(boxMaxSize+uniforms._Proximity_Near_Radius_,nearestProxDist))*(1.0-step(uniforms._Proximity_Far_Distance_,min(d1,d2))*(1.0-step(0.0001,showSelection)));let widths: vec2f=visibleWidth/faceSize;let px: f32=dot(vertexInputs.position,vertexInputs.tangent);let py: f32=dot(vertexInputs.position,binormalObject);let dx: f32=0.5-abs(px);let dy: f32=0.5-abs(py);let newX: f32=(0.5-dx*widths.x*2.0)*sign(px);let newY: f32=(0.5-dy*widths.y*2.0)*sign(py);let wirePosObject: vec3f=vertexInputs.normal*0.5+newX*vertexInputs.tangent+newY*binormalObject;let wireUV: vec2f=vec2f(dot(wirePosObject,vertexInputs.tangent)+0.5,dot(wirePosObject,binormalObject)+0.5);let wireWorldPos: vec3f=(uniforms.world*vec4f(wirePosObject,1.0)).xyz;let hitDistance: f32=dot(chosenBlobPosition-faceCenter,normalWorldN);let hitPosition: vec3f=chosenBlobPosition-hitDistance*normalWorldN;let absHitDistance: f32=abs(hitDistance);let blobLerp: f32=clamp((absHitDistance-uniforms._Blob_Near_Distance_)/(uniforms._Blob_Far_Distance_-uniforms._Blob_Near_Distance_),0.0,1.0);let fadeIn: f32=1.0-clamp((absHitDistance-uniforms._Blob_Far_Distance_)/uniforms._Blob_Fade_Length_,0.0,1.0);let innerFade: f32=1.0-clamp(-hitDistance/chosenBlobInnerFade,0.0,1.0);let farClip: f32=clamp(1.0-step(uniforms._Blob_Far_Distance_+uniforms._Blob_Fade_Length_,absHitDistance),0.0,1.0);let blobSize: f32=mix(mix(chosenBlobNearSize,uniforms._Blob_Far_Size_,blobLerp)*farClip,uniforms._Selection_Fade_Size_,uniforms._Selection_Fade_)*innerFade*chosenBlobEnable;var blobInfo: vec3f=vec3f(blobLerp*0.5+0.5,fadeIn*uniforms._Blob_Intensity_*(1.0-uniforms._Selection_Fade_)*chosenBlobFade,0.0);blobInfo.x*=1.0-chosenBlobPulse;let blobDelta: vec3f=hitPosition-faceCenter;let blobCenterXY: vec2f=vec2f(dot(blobDelta,tangentWorldN),dot(blobDelta,binormalWorldN));let quadUV: vec2f=2.0*vertexInputs.uv-vec2f(1.0);let blobXY: vec2f=blobCenterXY+quadUV*blobSize;let blobClipped: vec2f=clamp(blobXY,-faceSize*0.5,faceSize*0.5);let blobUV: vec2f=(blobClipped-blobCenterXY)/max(blobSize,0.0001)*2.0;let blobWorldPos: vec3f=faceCenter+blobClipped.x*tangentWorldN+blobClipped.y*binormalWorldN;let outWorldPos: vec3f=mix(wireWorldPos,blobWorldPos,vertexInputs.color.r);let outUV: vec2f=mix(wireUV,blobUV,vertexInputs.color.r);let incident: vec3f=normalize(wireWorldPos-uniforms.cameraPosition);let ndotI: f32=dot(incident,normalWorldN);let uvFlip: vec2f=vertexInputs.uv-vec2f(0.5);let uDot: f32=dot(incident,tangentWorld)*uvFlip.x*ndotI;let vDot: f32=-dot(incident,binormalWorld)*uvFlip.y*ndotI;let smoothAndActive: f32=step(1.0,step(0.5,uniforms._Smooth_Active_Face_)*step(0.0001,activeFaceAmount));let uVal: f32=mix(1.0-step(0.0,uDot),max(1.0,1.0-step(0.0,uDot)),smoothAndActive);let vVal: f32=mix(1.0-step(0.0,vDot),max(1.0,1.0-step(0.0,vDot)),smoothAndActive);let holoEdges: vec4f=vec4f(1.0)-vec4f(uVal*vertexInputs.uv.x,uVal*(1.0-vertexInputs.uv.x),vVal*vertexInputs.uv.y,vVal*(1.0-vertexInputs.uv.y));let xDir: vec3f=normalize(cross(activeFaceDir,upWorld))*uniforms._Proximity_Anisotropy_;let yDir: vec3f=cross(activeFaceDir,normalize(cross(activeFaceDir,upWorld)));let deltaLeft: vec3f=blobPositionLeft-wireWorldPos;let deltaRight: vec3f=blobPositionRight-wireWorldPos;let distLeft: f32=abs(dot(deltaLeft,activeFaceDir));let distRight: f32=abs(dot(deltaRight,activeFaceDir));let extra1: vec4f=vec4f(dot(deltaLeft,xDir),dot(deltaLeft,yDir),dot(deltaRight,xDir),dot(deltaRight,yDir))/relativeScale;let distanceToFace: f32=dot(activeFaceDir,wireWorldPos-activeFaceCenter);let intensity: f32=1.0-clamp(min(distLeft,distRight)/uniforms._Proximity_Far_Distance_,0.0,1.0);vertexOutputs.position=uniforms.viewProjection*vec4f(outWorldPos,1.0);vertexOutputs.vPosition=outWorldPos;vertexOutputs.vNormal=vec3f(widths.x,widths.y,vertexInputs.color.r);vertexOutputs.vUV=outUV;vertexOutputs.vTangent=blobInfo;vertexOutputs.vBinormal=vec3f(showSelection,distanceToFace,intensity);vertexOutputs.vColor=holoEdges;vertexOutputs.vExtra1=extra1;}
24
+ `;
25
+ // Sideeffect
26
+ if (!ShaderStore.ShadersStoreWGSL[name]) {
27
+ ShaderStore.ShadersStoreWGSL[name] = shader;
28
+ }
29
+ /** @internal */
30
+ export const fluentButtonVertexShaderWGSL = { name, shader };
31
+ //# sourceMappingURL=fluentButton.vertex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fluentButton.vertex.js","sourceRoot":"","sources":["../../../../../../../dev/gui/src/3D/materials/fluentButton/wgsl/fluentButton.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,IAAI,GAAG,0BAA0B,CAAC;AACxC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;CAoBd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentButtonVertexShader\";\nconst shader = `uniform world: mat4x4f;uniform viewProjection: mat4x4f;uniform cameraPosition: vec3f;attribute position: vec3f;attribute normal: vec3f;attribute uv: vec2f;attribute tangent: vec3f;attribute color: vec4f;uniform _Edge_Width_: f32;uniform _Proximity_Far_Distance_: f32;uniform _Proximity_Near_Radius_: f32;uniform _Proximity_Anisotropy_: f32;uniform _Selection_Fuzz_: f32;uniform _Selected_: f32;uniform _Selection_Fade_: f32;uniform _Selection_Fade_Size_: f32;uniform _Selected_Distance_: f32;uniform _Selected_Fade_Length_: f32;uniform _Blob_Enable_: f32;uniform _Blob_Position_: vec3f;uniform _Blob_Intensity_: f32;uniform _Blob_Near_Size_: f32;uniform _Blob_Far_Size_: f32;uniform _Blob_Near_Distance_: f32;uniform _Blob_Far_Distance_: f32;uniform _Blob_Fade_Length_: f32;uniform _Blob_Inner_Fade_: f32;uniform _Blob_Pulse_: f32;uniform _Blob_Fade_: f32;uniform _Blob_Enable_2_: f32;uniform _Blob_Position_2_: vec3f;uniform _Blob_Near_Size_2_: f32;uniform _Blob_Inner_Fade_2_: f32;uniform _Blob_Pulse_2_: f32;uniform _Blob_Fade_2_: f32;uniform _Active_Face_Dir_: vec3f;uniform _Active_Face_Up_: vec3f;uniform _Smooth_Active_Face_: f32;uniform Use_Global_Left_Index: f32;uniform Use_Global_Right_Index: f32;uniform Global_Left_Index_Tip_Position: vec4f;uniform Global_Right_Index_Tip_Position: vec4f;varying vPosition: vec3f;varying vNormal: vec3f;varying vUV: vec2f;varying vTangent: vec3f;varying vBinormal: vec3f;varying vColor: vec4f;varying vExtra1: vec4f;fn ramp2(start: vec2f,end: vec2f,x: vec2f)->vec2f {return clamp((x-start)/(end-start),vec2f(0.0),vec2f(1.0));}\nfn computeSelection(\nblobPosition: vec3f,\nnormal: vec3f,\ntangentDir: vec3f,\nbitangent: vec3f,\nfaceCenter: vec3f,\nfaceSize: vec2f,\nselectionFuzz: f32,\nfarDistance: f32,\nfadeLength: f32\n)->f32 {let delta: vec3f=blobPosition-faceCenter;let absD: f32=abs(dot(delta,normal));let fadeIn: f32=1.0-clamp((absD-farDistance)/fadeLength,0.0,1.0);let blobCenterXY: vec2f=vec2f(dot(delta,tangentDir),dot(delta,bitangent));let innerFace: vec2f=faceSize*(1.0-selectionFuzz)*0.5;let selectPulse: vec2f=ramp2(-faceSize*0.5,-innerFace,blobCenterXY)-ramp2(innerFace,faceSize*0.5,blobCenterXY);return selectPulse.x*selectPulse.y*fadeIn;}\n@vertex\nfn main(input: VertexInputs)->FragmentInputs {let blobPositionLeft: vec3f=mix(uniforms._Blob_Position_,uniforms.Global_Left_Index_Tip_Position.xyz,step(0.5,uniforms.Use_Global_Left_Index));let blobPositionRight: vec3f=mix(uniforms._Blob_Position_2_,uniforms.Global_Right_Index_Tip_Position.xyz,step(0.5,uniforms.Use_Global_Right_Index));let activeFaceCenter: vec3f=(uniforms.world*vec4f(uniforms._Active_Face_Dir_*0.5,1.0)).xyz;let activeFaceDir: vec3f=normalize((uniforms.world*vec4f(uniforms._Active_Face_Dir_,0.0)).xyz);\n#ifdef RELATIVE_WIDTH\nlet relativeScale: f32=length((uniforms.world*vec4f(vec3f(0.0,1.0,0.0),0.0)).xyz);\n#else\nlet relativeScale: f32=1.0;\n#endif\nlet tangentWorld: vec3f=(uniforms.world*vec4f(vertexInputs.tangent,0.0)).xyz;let binormalObject: vec3f=cross(vertexInputs.normal,vertexInputs.tangent);let binormalWorld: vec3f=(uniforms.world*vec4f(binormalObject,0.0)).xyz;let normalWorld: vec3f=(uniforms.world*vec4f(vertexInputs.normal,0.0)).xyz;let normalWorldN: vec3f=normalize(normalWorld);let tangentWorldN: vec3f=normalize(tangentWorld);let binormalWorldN: vec3f=normalize(binormalWorld);let faceCenter: vec3f=(uniforms.world*vec4f(0.5*vertexInputs.normal,1.0)).xyz;let faceSize: vec2f=vec2f(length(tangentWorld),length(binormalWorld));let chosenBlobPosition: vec3f=mix(blobPositionLeft,blobPositionRight,vertexInputs.color.g);let chosenBlobEnable: f32=mix(uniforms._Blob_Enable_,uniforms._Blob_Enable_2_,vertexInputs.color.g);let chosenBlobPulse: f32=mix(uniforms._Blob_Pulse_,uniforms._Blob_Pulse_2_,vertexInputs.color.g);let chosenBlobFade: f32=mix(uniforms._Blob_Fade_,uniforms._Blob_Fade_2_,vertexInputs.color.g);let chosenBlobNearSize: f32=mix(uniforms._Blob_Near_Size_,uniforms._Blob_Near_Size_2_,vertexInputs.color.g);let chosenBlobInnerFade: f32=mix(uniforms._Blob_Inner_Fade_,uniforms._Blob_Inner_Fade_2_,vertexInputs.color.g);let selectLeft: f32=computeSelection(blobPositionLeft,normalWorldN,tangentWorldN,binormalWorldN,faceCenter,faceSize,uniforms._Selection_Fuzz_,uniforms._Selected_Distance_,uniforms._Selected_Fade_Length_);let selectRight: f32=computeSelection(blobPositionRight,normalWorldN,tangentWorldN,binormalWorldN,faceCenter,faceSize,uniforms._Selection_Fuzz_,uniforms._Selected_Distance_,uniforms._Selected_Fade_Length_);let activeFaceAmount: f32=max(0.0,dot(activeFaceDir,normalWorldN));let showSelection: f32=mix(max(selectLeft,selectRight),1.0,uniforms._Selected_)*activeFaceAmount;let upWorld: vec3f=normalize((uniforms.world*vec4f(uniforms._Active_Face_Up_,0.0)).xyz);let edgeWidth: f32=uniforms._Edge_Width_*relativeScale;let boxEdges: vec3f=(uniforms.world*vec4f(vec3f(0.5),0.0)).xyz;let boxMaxSize: f32=length(boxEdges);let d1: f32=dot(blobPositionLeft-activeFaceCenter,activeFaceDir);let d2: f32=dot(blobPositionRight-activeFaceCenter,activeFaceDir);let projectedBlobLeft: vec3f=blobPositionLeft-d1*activeFaceDir;let projectedBlobRight: vec3f=blobPositionRight-d2*activeFaceDir;let nearestProxDist: f32=sqrt(min(dot(projectedBlobLeft-activeFaceCenter,projectedBlobLeft-activeFaceCenter),dot(projectedBlobRight-activeFaceCenter,projectedBlobRight-activeFaceCenter)));let visibleWidth: f32=edgeWidth*(1.0-step(boxMaxSize+uniforms._Proximity_Near_Radius_,nearestProxDist))*(1.0-step(uniforms._Proximity_Far_Distance_,min(d1,d2))*(1.0-step(0.0001,showSelection)));let widths: vec2f=visibleWidth/faceSize;let px: f32=dot(vertexInputs.position,vertexInputs.tangent);let py: f32=dot(vertexInputs.position,binormalObject);let dx: f32=0.5-abs(px);let dy: f32=0.5-abs(py);let newX: f32=(0.5-dx*widths.x*2.0)*sign(px);let newY: f32=(0.5-dy*widths.y*2.0)*sign(py);let wirePosObject: vec3f=vertexInputs.normal*0.5+newX*vertexInputs.tangent+newY*binormalObject;let wireUV: vec2f=vec2f(dot(wirePosObject,vertexInputs.tangent)+0.5,dot(wirePosObject,binormalObject)+0.5);let wireWorldPos: vec3f=(uniforms.world*vec4f(wirePosObject,1.0)).xyz;let hitDistance: f32=dot(chosenBlobPosition-faceCenter,normalWorldN);let hitPosition: vec3f=chosenBlobPosition-hitDistance*normalWorldN;let absHitDistance: f32=abs(hitDistance);let blobLerp: f32=clamp((absHitDistance-uniforms._Blob_Near_Distance_)/(uniforms._Blob_Far_Distance_-uniforms._Blob_Near_Distance_),0.0,1.0);let fadeIn: f32=1.0-clamp((absHitDistance-uniforms._Blob_Far_Distance_)/uniforms._Blob_Fade_Length_,0.0,1.0);let innerFade: f32=1.0-clamp(-hitDistance/chosenBlobInnerFade,0.0,1.0);let farClip: f32=clamp(1.0-step(uniforms._Blob_Far_Distance_+uniforms._Blob_Fade_Length_,absHitDistance),0.0,1.0);let blobSize: f32=mix(mix(chosenBlobNearSize,uniforms._Blob_Far_Size_,blobLerp)*farClip,uniforms._Selection_Fade_Size_,uniforms._Selection_Fade_)*innerFade*chosenBlobEnable;var blobInfo: vec3f=vec3f(blobLerp*0.5+0.5,fadeIn*uniforms._Blob_Intensity_*(1.0-uniforms._Selection_Fade_)*chosenBlobFade,0.0);blobInfo.x*=1.0-chosenBlobPulse;let blobDelta: vec3f=hitPosition-faceCenter;let blobCenterXY: vec2f=vec2f(dot(blobDelta,tangentWorldN),dot(blobDelta,binormalWorldN));let quadUV: vec2f=2.0*vertexInputs.uv-vec2f(1.0);let blobXY: vec2f=blobCenterXY+quadUV*blobSize;let blobClipped: vec2f=clamp(blobXY,-faceSize*0.5,faceSize*0.5);let blobUV: vec2f=(blobClipped-blobCenterXY)/max(blobSize,0.0001)*2.0;let blobWorldPos: vec3f=faceCenter+blobClipped.x*tangentWorldN+blobClipped.y*binormalWorldN;let outWorldPos: vec3f=mix(wireWorldPos,blobWorldPos,vertexInputs.color.r);let outUV: vec2f=mix(wireUV,blobUV,vertexInputs.color.r);let incident: vec3f=normalize(wireWorldPos-uniforms.cameraPosition);let ndotI: f32=dot(incident,normalWorldN);let uvFlip: vec2f=vertexInputs.uv-vec2f(0.5);let uDot: f32=dot(incident,tangentWorld)*uvFlip.x*ndotI;let vDot: f32=-dot(incident,binormalWorld)*uvFlip.y*ndotI;let smoothAndActive: f32=step(1.0,step(0.5,uniforms._Smooth_Active_Face_)*step(0.0001,activeFaceAmount));let uVal: f32=mix(1.0-step(0.0,uDot),max(1.0,1.0-step(0.0,uDot)),smoothAndActive);let vVal: f32=mix(1.0-step(0.0,vDot),max(1.0,1.0-step(0.0,vDot)),smoothAndActive);let holoEdges: vec4f=vec4f(1.0)-vec4f(uVal*vertexInputs.uv.x,uVal*(1.0-vertexInputs.uv.x),vVal*vertexInputs.uv.y,vVal*(1.0-vertexInputs.uv.y));let xDir: vec3f=normalize(cross(activeFaceDir,upWorld))*uniforms._Proximity_Anisotropy_;let yDir: vec3f=cross(activeFaceDir,normalize(cross(activeFaceDir,upWorld)));let deltaLeft: vec3f=blobPositionLeft-wireWorldPos;let deltaRight: vec3f=blobPositionRight-wireWorldPos;let distLeft: f32=abs(dot(deltaLeft,activeFaceDir));let distRight: f32=abs(dot(deltaRight,activeFaceDir));let extra1: vec4f=vec4f(dot(deltaLeft,xDir),dot(deltaLeft,yDir),dot(deltaRight,xDir),dot(deltaRight,yDir))/relativeScale;let distanceToFace: f32=dot(activeFaceDir,wireWorldPos-activeFaceCenter);let intensity: f32=1.0-clamp(min(distLeft,distRight)/uniforms._Proximity_Far_Distance_,0.0,1.0);vertexOutputs.position=uniforms.viewProjection*vec4f(outWorldPos,1.0);vertexOutputs.vPosition=outWorldPos;vertexOutputs.vNormal=vec3f(widths.x,widths.y,vertexInputs.color.r);vertexOutputs.vUV=outUV;vertexOutputs.vTangent=blobInfo;vertexOutputs.vBinormal=vec3f(showSelection,distanceToFace,intensity);vertexOutputs.vColor=holoEdges;vertexOutputs.vExtra1=extra1;}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n\n/** @internal */\nexport const fluentButtonVertexShaderWGSL = { name, shader };\n"]}
@@ -33,11 +33,18 @@ export class HandleMaterial extends ShaderMaterial {
33
33
  * @param scene Scene
34
34
  */
35
35
  constructor(name, scene) {
36
+ const shaderLanguage = scene.getEngine().isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */;
36
37
  super(name, scene, "handle", {
37
38
  attributes: ["position"],
38
39
  uniforms: ["worldViewProjection", "color", "scale", "positionOffset"],
39
40
  needAlphaBlending: false,
40
41
  needAlphaTesting: false,
42
+ shaderLanguage,
43
+ extraInitializationsAsync: shaderLanguage === 1 /* ShaderLanguage.WGSL */
44
+ ? async () => {
45
+ await Promise.all([import("./wgsl/handle.vertex.js"), import("./wgsl/handle.fragment.js")]);
46
+ }
47
+ : undefined,
41
48
  });
42
49
  this._hover = false;
43
50
  this._drag = false;
@@ -1 +1 @@
1
- {"version":3,"file":"handleMaterial.js","sourceRoot":"","sources":["../../../../../../dev/gui/src/3D/materials/handle/handleMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { Color3, TmpColors } from \"core/Maths/math.color\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\n\r\nimport \"./shaders/handle.vertex\";\r\nimport \"./shaders/handle.fragment\";\r\n\r\n/**\r\n * Class used to render gizmo handles with fluent design\r\n */\r\nexport class HandleMaterial extends ShaderMaterial {\r\n private _hover: boolean = false;\r\n private _drag: boolean = false;\r\n private _onBeforeRender: Nullable<Observer<Scene>>;\r\n private _color: Color3 = new Color3();\r\n private _scale: number = 1;\r\n private _targetColor: Color3;\r\n private _targetScale: number;\r\n private _lastTick = -1;\r\n\r\n /**\r\n * Is the material indicating hovering state\r\n */\r\n public get hover(): boolean {\r\n return this._hover;\r\n }\r\n\r\n public set hover(b: boolean) {\r\n this._hover = b;\r\n\r\n this._updateInterpolationTarget();\r\n }\r\n\r\n /**\r\n * Is the material indicating drag state\r\n */\r\n public get drag(): boolean {\r\n return this._drag;\r\n }\r\n\r\n public set drag(b: boolean) {\r\n this._drag = b;\r\n\r\n this._updateInterpolationTarget();\r\n }\r\n\r\n /**\r\n * Length of animation\r\n */\r\n public animationLength: number = 100;\r\n\r\n /**\r\n * Color of the handle when hovered\r\n */\r\n public hoverColor: Color3 = new Color3(0, 0.467, 0.84);\r\n\r\n /**\r\n * Color of the handle when idle\r\n */\r\n public baseColor: Color3 = new Color3(1, 1, 1);\r\n\r\n /**\r\n * Scale of the handle when hovered\r\n */\r\n public hoverScale: number = 0.75;\r\n\r\n /**\r\n * Scale of the handle when idle\r\n */\r\n public baseScale: number = 0.35;\r\n\r\n /**\r\n * Scale of the handle when dragged\r\n */\r\n public dragScale: number = 0.55;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _positionOffset: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * Creates a handle material\r\n * @param name Name of the material\r\n * @param scene Scene\r\n */\r\n constructor(name: string, scene: Scene) {\r\n super(name, scene, \"handle\", {\r\n attributes: [\"position\"],\r\n uniforms: [\"worldViewProjection\", \"color\", \"scale\", \"positionOffset\"],\r\n needAlphaBlending: false,\r\n needAlphaTesting: false,\r\n });\r\n\r\n this._updateInterpolationTarget();\r\n\r\n // Register callback for scene after render\r\n this._lastTick = Date.now();\r\n this._onBeforeRender = this.getScene().onBeforeRenderObservable.add(() => {\r\n const tick = Date.now();\r\n const delta = tick - this._lastTick;\r\n\r\n const scaleDiff = this._targetScale - this._scale;\r\n const colorDiff = TmpColors.Color3[0].copyFrom(this._targetColor).subtractToRef(this._color, TmpColors.Color3[0]);\r\n\r\n this._scale = this._scale + (scaleDiff * delta) / this.animationLength;\r\n colorDiff.scaleToRef(delta / this.animationLength, colorDiff);\r\n this._color.addToRef(colorDiff, this._color);\r\n\r\n this.setColor3(\"color\", this._color);\r\n this.setFloat(\"scale\", this._scale);\r\n this.setVector3(\"positionOffset\", this._positionOffset);\r\n\r\n this._lastTick = tick;\r\n });\r\n }\r\n\r\n private _updateInterpolationTarget() {\r\n if (this.drag) {\r\n this._targetColor = this.hoverColor;\r\n this._targetScale = this.dragScale;\r\n } else if (this.hover) {\r\n this._targetColor = this.hoverColor;\r\n this._targetScale = this.hoverScale;\r\n } else {\r\n this._targetColor = this.baseColor;\r\n this._targetScale = this.baseScale;\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the handle material\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n this.getScene().onBeforeRenderObservable.remove(this._onBeforeRender);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"handleMaterial.js","sourceRoot":"","sources":["../../../../../../dev/gui/src/3D/materials/handle/handleMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { Color3, TmpColors } from \"core/Maths/math.color\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\nimport \"./shaders/handle.vertex\";\r\nimport \"./shaders/handle.fragment\";\r\n\r\n/**\r\n * Class used to render gizmo handles with fluent design\r\n */\r\nexport class HandleMaterial extends ShaderMaterial {\r\n private _hover: boolean = false;\r\n private _drag: boolean = false;\r\n private _onBeforeRender: Nullable<Observer<Scene>>;\r\n private _color: Color3 = new Color3();\r\n private _scale: number = 1;\r\n private _targetColor: Color3;\r\n private _targetScale: number;\r\n private _lastTick = -1;\r\n\r\n /**\r\n * Is the material indicating hovering state\r\n */\r\n public get hover(): boolean {\r\n return this._hover;\r\n }\r\n\r\n public set hover(b: boolean) {\r\n this._hover = b;\r\n\r\n this._updateInterpolationTarget();\r\n }\r\n\r\n /**\r\n * Is the material indicating drag state\r\n */\r\n public get drag(): boolean {\r\n return this._drag;\r\n }\r\n\r\n public set drag(b: boolean) {\r\n this._drag = b;\r\n\r\n this._updateInterpolationTarget();\r\n }\r\n\r\n /**\r\n * Length of animation\r\n */\r\n public animationLength: number = 100;\r\n\r\n /**\r\n * Color of the handle when hovered\r\n */\r\n public hoverColor: Color3 = new Color3(0, 0.467, 0.84);\r\n\r\n /**\r\n * Color of the handle when idle\r\n */\r\n public baseColor: Color3 = new Color3(1, 1, 1);\r\n\r\n /**\r\n * Scale of the handle when hovered\r\n */\r\n public hoverScale: number = 0.75;\r\n\r\n /**\r\n * Scale of the handle when idle\r\n */\r\n public baseScale: number = 0.35;\r\n\r\n /**\r\n * Scale of the handle when dragged\r\n */\r\n public dragScale: number = 0.55;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _positionOffset: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * Creates a handle material\r\n * @param name Name of the material\r\n * @param scene Scene\r\n */\r\n constructor(name: string, scene: Scene) {\r\n const shaderLanguage = scene.getEngine().isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL;\r\n\r\n super(name, scene, \"handle\", {\r\n attributes: [\"position\"],\r\n uniforms: [\"worldViewProjection\", \"color\", \"scale\", \"positionOffset\"],\r\n needAlphaBlending: false,\r\n needAlphaTesting: false,\r\n shaderLanguage,\r\n extraInitializationsAsync:\r\n shaderLanguage === ShaderLanguage.WGSL\r\n ? async () => {\r\n await Promise.all([import(\"./wgsl/handle.vertex\"), import(\"./wgsl/handle.fragment\")]);\r\n }\r\n : undefined,\r\n });\r\n\r\n this._updateInterpolationTarget();\r\n\r\n // Register callback for scene after render\r\n this._lastTick = Date.now();\r\n this._onBeforeRender = this.getScene().onBeforeRenderObservable.add(() => {\r\n const tick = Date.now();\r\n const delta = tick - this._lastTick;\r\n\r\n const scaleDiff = this._targetScale - this._scale;\r\n const colorDiff = TmpColors.Color3[0].copyFrom(this._targetColor).subtractToRef(this._color, TmpColors.Color3[0]);\r\n\r\n this._scale = this._scale + (scaleDiff * delta) / this.animationLength;\r\n colorDiff.scaleToRef(delta / this.animationLength, colorDiff);\r\n this._color.addToRef(colorDiff, this._color);\r\n\r\n this.setColor3(\"color\", this._color);\r\n this.setFloat(\"scale\", this._scale);\r\n this.setVector3(\"positionOffset\", this._positionOffset);\r\n\r\n this._lastTick = tick;\r\n });\r\n }\r\n\r\n private _updateInterpolationTarget() {\r\n if (this.drag) {\r\n this._targetColor = this.hoverColor;\r\n this._targetScale = this.dragScale;\r\n } else if (this.hover) {\r\n this._targetColor = this.hoverColor;\r\n this._targetScale = this.hoverScale;\r\n } else {\r\n this._targetColor = this.baseColor;\r\n this._targetScale = this.baseScale;\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the handle material\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n this.getScene().onBeforeRenderObservable.remove(this._onBeforeRender);\r\n }\r\n}\r\n"]}
@@ -0,0 +1,5 @@
1
+ /** @internal */
2
+ export declare const handlePixelShaderWGSL: {
3
+ name: string;
4
+ shader: string;
5
+ };
@@ -0,0 +1,13 @@
1
+ // Do not edit.
2
+ import { ShaderStore } from "@babylonjs/core/Engines/shaderStore.js";
3
+ const name = "handlePixelShader";
4
+ const shader = `uniform color: vec3f;@fragment
5
+ fn main(input: FragmentInputs)->FragmentOutputs {fragmentOutputs.color=vec4f(uniforms.color,1.0);}
6
+ `;
7
+ // Sideeffect
8
+ if (!ShaderStore.ShadersStoreWGSL[name]) {
9
+ ShaderStore.ShadersStoreWGSL[name] = shader;
10
+ }
11
+ /** @internal */
12
+ export const handlePixelShaderWGSL = { name, shader };
13
+ //# sourceMappingURL=handle.fragment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle.fragment.js","sourceRoot":"","sources":["../../../../../../../dev/gui/src/3D/materials/handle/wgsl/handle.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,IAAI,GAAG,mBAAmB,CAAC;AACjC,MAAM,MAAM,GAAG;;CAEd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"handlePixelShader\";\nconst shader = `uniform color: vec3f;@fragment\nfn main(input: FragmentInputs)->FragmentOutputs {fragmentOutputs.color=vec4f(uniforms.color,1.0);}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n\n/** @internal */\nexport const handlePixelShaderWGSL = { name, shader };\n"]}